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

时间:2014-06-25 05:05:06

标签: java spring spring-mvc annotations dao

在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类型的地图对象?。

我试过但我得到了像空指针异常

这样的异常

请任何人帮助我..

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

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

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默认为singleton作用域。所以你可以做到以下几点。

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

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

}

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

如果您不想在Spring之前执行此操作,并且如果您想减少工作量,请尝试使用ThreadLocal传递参数。

答案 2 :(得分:0)

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

<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>

默认情况下,<map />的目标类是LinkedHashMap,但您可以使用MapFactoryBean更改目标类,以此方式通过替换<map />来构建地图对象标记:

<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>