`
胡小米
  • 浏览: 75772 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(转载)使用constructor-arg子标签,来指定构造函数的参数

 
阅读更多
[color=violet][/color]
   Spring使用spring-beans.dtd文件来定义BeanFactory的XML配置规范。可以在http://www.springframework.org/dtd/spring-beans.dtd找到该dtd文件,当然,Spring的下载文件中也已经包含了该dtd文件。它被放在dist文件夹中。
      配置文件的根元素是beans,每个组件使用bean元素来定义,bean元素可以有许多属性,其中有两个是必须的:id和class(这里说的id是必须的并不意味着在配置文件中必须指定id,后面会详细说明)。id表示组件的默认名称,class表示组件的类型。
      如果使用设值注入,则需要使用property子标签,来指定组件的属性。
<bean id="renderer" class="com.apress.prospring.ch2.StandardOutMessageRenderer">
    <property name="messageProvider">
        <ref local="provider"/>
    </property>
</bean>
      使用构造子注入时,则使用constructor-arg子标签,来指定构造函数的参数。
<bean id="provider" class="com.apress.prospring.ch4.ConfigurableMessageProvider">
    <constructor-arg>
        <value>This is a configurable message</value>
    </constructor-arg>
</bean>
      当构造函数有多个参数时,可以使用constructor-arg标签的index属性,index属性的值从0开始。
<bean id="provider" class="com.apress.prospring.ch4.ConfigurableMessageProvider">
    <constructor-arg index="0">
        <value>first parameter</value>
    </constructor-arg>
    <constructor-arg index="1">
        <value>second parameter</value>
    </constructor-arg>

</bean>
     在使用构造子注入时,需要注意的问题是要避免构造子冲突的情况发生。考虑下面的情况:
public class ConstructorConfusion {
    public ConstructorConfusion(String someValue) {
        System.out.println("ConstructorConfusion(String) called");
    }
    public ConstructorConfusion(int someValue) {
        System.out.println("ConstructorConfusion(int) called");
    }
}
     使用如下配置文件
<bean id="constructorConfusion" class="com.apress.prospring.ch4.ConstructorConfusion">
    <constructor-arg>
        <value>90</value>
    </constructor-arg>
</bean>
     那么,当实例化组件constructorConfusion时,将输出ConstructorConfusion(String) called,也就是说参数类型为String的构造函数被调用了,这显然不符合我们的要求。为了让Spring调用参数为int的构造函数来实例化组件constructorConfusion,我们需要在配置文件中明确的告诉Spring,需要使用哪个构造函数,这需要使用constructor-arg的type属性。
<bean id="constructorConfusion" class="com.apress.prospring.ch4.ConstructorConfusion">
    <constructor-arg type="int">
        <value>90</value>
    </constructor-arg>
</bean>
     我们不仅可以构造单个BeanFactory,而且可以建立有继承关系的多个BeanFactory。只需要将父BeanFactory作为参数传给子BeanFactory的构造函数即可。
BeanFactory parent =
    new XmlBeanFactory(new FileSystemResource("./ch4/src/conf/parent.xml"));
BeanFactory child =
    new XmlBeanFactory(new FileSystemResource("./ch4/src/conf/beans.xml"), parent);
     如果子BeanFactory和父BeanFactory中含有名称相同的Bean,那么在子BeanFactory中使用
<ref bean="sameNameBean"/>引用的将是子BeanFactory中的bean,为了引用父BeanFactory中的bean,我们需要使用ref标签的parent属性,<ref parent="sameNameBean"/>。
     为了注入集合属性,Spring提供了list,map,set和props标签,分别对应List,Map,Set和Properties,我们甚至可以嵌套的使用它们(List of Maps of Sets of Lists)。
<bean id="injectCollection" class="com.apress.prospring.ch4.CollectionInjection">
    <property name="map">
        <map>
            <entry key="someValue">
                <value>Hello World!</value>
            </entry>
            <entry key="someBean">
                <ref local="oracle"/>
             </entry>
        </map>
    </property>
    <property name="props">
        <props>
            <prop key="firstName">
                Rob
            </prop>
            <prop key="secondName">
                Harrop
            </prop>
        </props>
    </property>
    <property name="set">
        <set>
            <value>Hello World!</value>
            <ref local="oracle"/>
        </set>
    </property>
    <property name="list">
        <list>
            <value>Hello World!</value>
            <ref local="oracle"/>
         </list>
    </property>
</bean>
/*************************

type 的值定义的类型必须与构造器定义的类型一致,并且不支持类型的自动包装[/size]
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics