Как внедрить объект типа карты весной 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
передать параметры.