[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"/> <!--注释此处--> <!-- ...
也可以通过索引来指定构造函数参数的顺序: ```xml <constructor-arg index="0" value="258"/> <constructor-arg index="1" value="XXX"/> ``` 2. **Setter注入** Setter注入是最常见的依赖注入方式,...
在Spring配置文件中,可以通过`<bean>`标签的`constructor-arg`子标签来指定构造函数参数,Spring会根据这些参数调用相应的构造函数来创建Bean实例。例如: ```xml <constructor-arg value="param1"/> ...
这通常通过`<object>`标签实现,指定`type`属性为要创建的对象类型,并可以使用`constructor-arg`子元素提供构造函数参数。例如: ```xml , MyAssembly"> <constructor-arg index="0" value="param1"/> ...
3. 使用<constructor-arg>标签来配置Bean的构造函数,例如:<constructor-arg> 4. 使用标签来配置Bean的集合属性,例如:<list> <value>com/alonely/vo/User.hbm.xml</value> </list> 在ApplicationContext.xml...
在XML配置文件中,可以定义一个bean,并使用`<constructor-arg>`或`<constructor-ref>`元素来指定构造函数参数。例如: ```xml <constructor-arg value="dependencyValue1"/> <constructor-arg> </...
DI主要通过setter方法、构造函数和接口来实现。 1. Setter方法注入: 当一个类的成员变量是接口类型时,Spring会通过setter方法来注入其实现类。例如,如果我们有一个`UserService`接口和它的实现类`...
在上面的配置文件中,我们使用`<constructor-arg>`元素将三个参数传递给Car对象的构造函数。 总结 Spring依赖注入的两种方式:Set方法注入和构造注入。Set方法注入是通过对象的setter方法来完成依赖关系的设置,而...
2. 在 beans.xml 文件中,使用 `<constructor-arg>` 元素来指定构造函数的参数值,例如 `<constructor-arg index="0" type="java.lang.String" value="大明" />`。 3. 在 App1 类中,使用 ApplicationContext 对象来...
Spring配置文件中使用`<constructor-arg>`标签来指定构造函数参数。例如: ```xml <constructor-arg ref="dependencyBean"/> ``` 这里,Spring会调用`ExampleBean`的带一个参数的构造函数,并传入`...
使用的标签:constructor-arg 标签出现的位置:bean标签的内部 标签中的属性: type:用于指定要注入的数据的数据类型,该数据类型也是构造函数中某个或某些数据的类型 index:用于指定要注入的数据 给构造函数中...
在上面的配置中,我们使用了 `<constructor-arg>` 元素来指定构造函数的参数,index 属性指定了参数的索引,value 属性指定了参数的值。 通过有参构造函数创建(type 方式) 除了使用索引来指定构造函数的参数外,...
这是最常见的一种注入方式,通过在配置文件中定义bean,并使用`<property>`标签指定需要注入的属性。例如,配置文件中如下的代码: ```xml <!-- setter injection using the nested <ref/> element --> ...
在 Spring 中,可以通过 `<constructor-arg>` 标签指定构造函数参数。例如,如果 `User` 类有一个接受 `Home` 参数的构造函数,那么配置文件中会有如下代码: ```xml <constructor-arg> </constructor-arg> ...
在XML配置中,我们可以使用`constructor-arg`标签来传递参数: ```xml <constructor-arg value="张三" /> <constructor-arg value="25" /> ``` 或者在Java配置中,使用`@Autowired`注解和`@Value`注解: ```...
首先,我们需要一个带有参数的构造函数,然后在配置文件中使用`<constructor-arg>`标签指定构造函数的参数。例如: ```xml <constructor-arg ref="dependencyBean"/> ``` 这里,`exampleBean`的构造函数会接收到`...
除了这些基础属性,我们还可以在`<bean>`标签内添加`<property>`标签来设置bean的属性值,或使用`<constructor-arg>`来传递构造函数参数,如: ```xml <constructor-arg index="0" value="constructorArg1"/>...
这里使用了`<bean>`标签定义了一个名为“car”的Bean,并通过`<constructor-arg>`标签指定了构造函数参数。 - **通过`<property>`标签设置Bean属性**:可以使用`<property>`标签为Bean设置属性值。例如: ```xml...
2. **构造器注入**:使用`<constructor-arg>`标签指定构造函数参数,或者在注解配置中使用`@Autowired`配合构造函数。 3. **setter注入**:通过setter方法注入依赖,同样可以通过XML或注解实现。 4. **接口注入**...
```\n\n**装配构造方法参数**\n当一个Bean的构造函数有多个参数时,可以使用`<constructor-arg>`标签来设定参数值,通过`type`或`index`属性来指定参数的位置或类型。\n\n```xml <constructor-arg index="0"> ...