如何在 Spring 3.0 中注入地图类型对象

Posted

技术标签:

【中文标题】如何在 Spring 3.0 中注入地图类型对象【英文标题】:how to inject map type object in spring 3.0 【发布时间】:2014-08-15 12:54:09 【问题描述】:

在 DAO 中:

private Map<Integer,String> departments = new LinkedHashMap<Integer, String>();

@Override
public List<DepartmentEntity> getAllDepartments() 
    return this.sessionFactory.getCurrentSession().createQuery("from DepartmentEntity de order by LOWER(de.departmentname)").list();



@Override
public Map<Integer, String> loadDepartments() 
    departments.clear();
    for (DepartmentEntity de : getAllDepartments())
        departments.put(de.getDepartmentid(), de.getDepartmentname());
    return departments;

它工作正常,但在 spring 手动创建对象时它的代码很糟糕

private Map<Integer,String> departments;

那么,在我的情况下,如何从外部注入 LinkedHashMap 类型的地图对象?

我试过了,但我得到了空指针异常之类的异常

请任何人帮助我..

【问题讨论】:

不需要在方法外声明部门,可以在方法内声明并使用。 @KevalTrivedi 如果我将在方法中声明它也是相同的,但希望从外部注入对象类型的 LinkedHashMap。 这个链接可以帮助你:***.com/questions/3627897/… @KevalTrivedi 非常感谢... 【参考方案1】:
 <util:map id="myMap" map-class="java.util.LinkedHashMap" key-type="java.lang.Integer" value-type="java.lang.String"/>

<bean id="departmentDAOImpl" class="com.leadwinner.infra.assets.dao.DepartmentDAOImpl">
    <property name="departments" ref="myMap"></property>
</bean>

【讨论】:

【参考方案2】:

您可以执行以下操作: 例如。

class A
   private B b;

   public setB(B b)
      this.b = b;
   

   public Map getMapFromA()
      return b.getMap();
   



class B
   private Map tmp;

   public void setMap(HashMap t)
      tmp.putAll(t);
   
   public HashMap getMap()
      return tmp;
   

在 web.xml 中

<bean id="classB" class="default.B"/>
<bean id ="classA" class="default.A"/>
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="targetObject"><ref local="classA"></property>
        <property name="targetMethod"><value>setB</value></property>
        <property name="arguments"><ref local="classB"/></property>
</bean>

现在 spring bean 默认是单例范围的。因此,您可以执行以下操作。

function do()
   B b = ctx.getBean("classB");
   b.setMap(someMap);

   A a = ctx.getBean("classA");
   a.getMapFromA();


我还没有尝试过代码,但它会给你一个想法,我希望如此。有关 MethodInvokingFactoryBean 的更多详细信息:here

如果你不想通过 Spring 来做,如果你想要更少的努力尝试使用ThreadLocal 来传递参数。

【讨论】:

【参考方案3】:

以这种方式填充地图(使用构造函数注入):

<bean name="DAO" class="path.to.yourDAOClass">
  <constructor-arg index="0">
    <map>
      <entry key="1" value="One" />
      <entry key="2" value="Two" />
    </map> 
  </constructor-arg>
<bean>

默认情况下,&lt;map /&gt; 的目标类是 LinkedHashMap,但您可以使用 MapFactoryBean 更改目标类,通过将 &lt;map /&gt; 标记替换为:

<bean class="org.springframework.beans.factory.config.MapFactoryBean">
  <property name="targetMapClass">
    <value>java.util.HashMap</value>
  </property>
  <property name="sourceMap">
    <map>
      <entry key="1" value="One" />
      <entry key="2" value="Two" />
    </map> 
  </property>
</bean>

【讨论】:

以上是关于如何在 Spring 3.0 中注入地图类型对象的主要内容,如果未能解决你的问题,请参考以下文章

如何正确使用 Spring 注入集合类型?

Java面试官:如何正确使用 Spring 注入集合类型?

如何为 .NET Core 3.0 中 WPF 配置依赖注入 ?

如何将 application.yml 中的地图注入 Spring Boot 中的字段?

Spring 3.0 学习-DI 依赖注入_创建Spring 配置-使用一个或多个XML 文件作为配置文件,使用自动注入(byName),在代码中使用注解代替自动注入,使用自动扫描代替xml中bea(

spring 注入集合