Как внедрить объект типа карты весной 3.0

В ДАО:

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

Работает нормально, но весной создание объектов вручную - плохой код.

private Map<Integer,String> departments;

Итак, как внедрить объект карты типа LinkedHashMap с внешней стороны в моем случае?

Я пытался, но у меня есть исключения, такие как исключение нулевого указателя

Пожалуйста, помогите мне...

3 ответа

Решение
 <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>

Заполните карту следующим образом (используя конструктор):

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

Вы можете сделать что-то вроде ниже: например.

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>

Теперь весенние бобы по умолчанию имеют одинарную область видимости. Таким образом, вы можете сделать следующее.

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

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

}

Я не опробовал код, но он даст вам представление, я надеюсь на это. Подробнее о MethodInvokingFactoryBean: здесь

И если вы не хотите делать это к весне, и если вы хотите меньше усилий, попробуйте использовать ThreadLocal передать параметры.

Другие вопросы по тегам