如何在 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>
默认情况下,<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>
【讨论】:
以上是关于如何在 Spring 3.0 中注入地图类型对象的主要内容,如果未能解决你的问题,请参考以下文章
如何为 .NET Core 3.0 中 WPF 配置依赖注入 ?
如何将 application.yml 中的地图注入 Spring Boot 中的字段?
Spring 3.0 学习-DI 依赖注入_创建Spring 配置-使用一个或多个XML 文件作为配置文件,使用自动注入(byName),在代码中使用注解代替自动注入,使用自动扫描代替xml中bea(