【问题标题】:how to inject map type object in spring 3.0如何在 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。
  • 这个链接可以帮助你:stackoverflow.com/questions/3627897/…
  • @KevalTrivedi 非常感谢...

标签: java spring spring-mvc annotations dao


【解决方案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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-05
        • 2013-07-01
        • 1970-01-01
        • 2011-08-07
        • 2021-08-09
        • 1970-01-01
        相关资源
        最近更新 更多