[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]
分享到:
相关推荐
<constructor-arg index="0" ref="imageEngine"/> <constructor-arg type="int" index="1" value="180"/> <constructor-arg type="int" index="2" value="100000"/> <!--注释此处--> <!-- ...
使用no-constructor-bind消除构造函数中的绑定函数。 使用no-constructor-state可以消除no-constructor-state初始状态设置。 这样做,很可能您将能够使用ESLint的内置no-useless-constructor来删除应用程序中的许多...
boa-constructor-0.6.1.bin.setup
boa-constructor-0.6.1.src.win32.exe
boa-constructor-0.6.1.bin.setup 这是WINDOWS安装版本。也是最新的。不容易找啊。 这是第一个包
boa-constructor-0.6.1. for python2.5 支持拖拽的ui IDE
prototypal-oo-js-object-oriented-constructor-functions-lab-online-web-ft-110419-源码.rar
使用的标签:constructor-arg 标签出现的位置:bean标签的内部 标签中的属性: type:用于指定要注入的数据的数据类型,该数据类型也是构造函数中某个或某些数据的类型 index:用于指定要注入的数据 给构造函数中...
boa-constructor-0.4.4.win32 for python2.3.X wxpython 2.5.4.1
资源来自pypi官网。 资源全名:constructor-io-0.0.6.tar.gz
本文实例讲述了js核心基础之构造函数constructor用法。分享给大家供大家参考,具体如下: 在js中,可以利用构造函数来创建特定类型的对象,其中,有一些原生的构造函数,Object、Array、等等,所以,当type of ...
真正的原因是:一个对象的constructor是它的构造函数的prototype.constructor,而每一个函数都有一个prototype,默认情况下,这个prototype有一个constructor属性,指向的是它自己。 我觉得Javascript的设计本意是让...
Flower 3D构造函数 HTML网站的模块。 哪里有ru版本分支?
对象的constructor属性用于返回创建该对象的函数,也就是我们常说的构造函数,除了创建对象,构造函数(constructor) 还做了另一件有用的事情—自动为创建的新对象设置了原型对象(prototype object)
·工厂方法如果需要参数,都使用constructor-arg属性确定参数值。 ·其他依赖注入属性,都使用property 元素确定参数值。 Person.java PersonFactory.java Chinese.java American.java bean.xml SpringTest.java
构造函数示例 在JS中使用构造函数
(https://yalantis.com/blog/building-a-customizable-constructor-for-designers-of-android-wear-watch-face-apps) This is simple watchface constructor demo. It offers customization of the following ...
构造方法 马克-to-win Java视频 构造函数 constructor
dart-cli-president-constructor-int ...通过构造函数中的参数初始化字段。 科技栈 镖 Docker堆栈 谷歌/Dart 跑步 sudo ./install.sh -u 停止(可选) sudo ./install.sh -d 求助 sudo ./install.sh -h 信用
<constructor-arg type="java.lang.String"> <value>jxg/Qr4VbxU= </constructor-arg> <!-- password --> <constructor-arg type="java.lang.String"> <value>jxg/Qr4VbxU= </constructor-arg> <!--...