假设我有这样的课程:
public class MyClass {
...
private Map<String, Class> eventsMapping = new HashMap<String, Class>();
...
}
public void setEventsMapping(Map<String, Class> mappings){
this.eventsMapping = mappings;
}
如何使用填充的eventsMapping创建此类的bean?我的意思是bean的XML定义。问题是HashMap包含Classes而不是对象。
我认为应该是这样的:
<bean id="myBean" class="com.my.MyClass" >
<property name="eventsMapping">
<map>
<entry key="ABC">
<bean class="java.lang.Class">
???
</bean>
</entry>
</map>
</property>
</bean>
如何传递特定的类(不是对象)
答案 0 :(得分:4)
如果您要查找地图以java.lang.Class
个实例作为值,请使用
<bean id="myBean" class="com.my.MyClass">
<property name="eventsMapping">
<map>
<entry key="ABC" value="java.lang.Class" ></entry>
</map>
</property>
</bean>
Spring将使用转化服务将String
值java.lang.Class
更改为Class
的{{1}}个实例。
同样,您可以将值放在java.lang.Class
元素中。
<value>
答案 1 :(得分:2)
您无法创建类型为java.lang.Class
的bean:
<bean name="aClassBean" class="java.lang.Class" />
<强>原因:强>
From Javadocs:
Class没有公共构造函数。相反,类对象是在加载类时由Java虚拟机自动构造的,并且通过调用类加载器中的defineClass方法来构建。
要创建类型为java.lang.Class
的bean,请按以下方式创建bean:
<bean id="aClassBean" class="java.lang.Class" factory-method="forName">
<constructor-arg value="full.package.name.of.the.class"/>
</bean>
答案 2 :(得分:1)
您可以使用静态工厂方法创建bean:
<entry key="ABC">
<bean class="java.lang.Class" factory-method="forName">
<constructor-arg ref="className"/>
</bean>
</entry>
您也可以尝试使用从完全限定字符串到类的自动转换,但在使用通用映射时,这可能不适用。
答案 3 :(得分:0)
您可以尝试这样的事情
<bean id="dbFieldConverters" class="java.util.HashMap">
<constructor-arg>
<map value-type="java.lang.Class">
<entry key="tradeDate">
<value>java.util.Date</value>
</entry>
<entry key="lastUpdate">
<value>java.sql.Timestamp</value>
</entry>
</map>
</constructor-arg>
</bean>
答案 4 :(得分:0)
这适用于我的环境(Spring 4):
<map>
<entry key="my-key">
<value type="java.lang.Class">com.example.MyClassName</value>
</entry>
</map>
请注意,目标属性为Map<String, Class>
类型,java.lang.Class
用作值类型属性。