如何将原始类注入bean

时间:2013-11-05 15:22:41

标签: java spring

假设我有这样的课程:

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>

如何传递特定的类(不是对象)

5 个答案:

答案 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将使用转化服务将Stringjava.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用作值类型属性。