转:http://hi.baidu.com/tjx1222/blog/item/66dce1458142e12ecefca369.html
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 的值定义的类型必须与构造器定义的类型一致,并且不支持类型的自动包装
分享到:
相关推荐
<constructor-arg name="client" ref="elasticsearchClient" /> <constructor-arg> <bean class="org.elasticsearch.common.settings.ImmutableSettings" factory-method="settings"> <constructor-arg> ...
<constructor-arg type="java.lang.String" value="XXX"/> ``` - **通过索引指定参数** 也可以通过索引来指定构造函数参数的顺序: ```xml <constructor-arg index="0" value="258"/> <constructor-...
此外,`<constructor-arg>`和`<property>`支持了`ref`和`value`的简写形式,使得配置更简洁。 `spring-beans-3.1.xsd`还引入了`profile`概念,允许开发者根据不同的环境条件选择加载不同的bean配置,增强了部署的...
<constructor-arg> <value>localhost:7000 <value>localhost:7001 <!-- 添加其他节点... --> </constructor-arg> ``` 最后,我们讨论**哨兵(Sentinel)配置**。哨兵系统用于监控、故障检测和自动故障...
<constructor-arg ref="contextSource"/> <list><value>uid={0},ou=users,dc=example,dc=com</value></list> </constructor-arg> <constructor-arg> <bean class="org.springframework.security.ldap....
开发者可以通过`class`属性指定bean的实现类,通过`<property>`或`<constructor-arg>`子元素来注入依赖。此外,`<bean>`元素还支持通过`init-method`和`destroy-method`属性指定bean的初始化和销毁方法,以进行...
- 对于需要通过构造函数创建的对象,可以使用`<constructor-arg>`标签。例如: ```xml <constructor-arg value="exampleValue1"/> <constructor-arg value="exampleValue2"/> ``` 4. **依赖查找与自动装配...
<constructor-arg name="master"> ${sentinel.master} </constructor-arg> <constructor-arg> <constructor-arg> </constructor-arg> </constructor-arg> ``` 2. 创建`StringRedisTemplate`或`...
<constructor-arg ref="calculatorProcessor" /> </constructor-arg> <constructor-arg value="9090" /> ``` 5. **启动 Thrift 服务**:在 Spring 应用启动时,通过调用 `TServer.start()` 方法启动 ...
在Spring配置文件中,可以通过`<bean>`标签的`constructor-arg`子标签来指定构造函数参数,Spring会根据这些参数调用相应的构造函数来创建Bean实例。例如: ```xml <constructor-arg value="param1"/> ...
4. `<constructor-arg>`:用于传递构造函数参数,与`<property>`类似,但它是针对构造函数的。 5. `<aop:config>`:定义AOP(面向切面编程)的配置,包括切点、通知和顾问等。 6. `<tx:annotation-driven>`:启用...
<constructor-arg name="host" value="192.168.152.180"></constructor-arg> <constructor-arg name="port" value="6379"></constructor-arg> ``` 这些配置文件演示了如何初始化Jedis连接池,并将其交给Spring...
<constructor-arg type="java.lang.String"> <value>jxg/Qr4VbxU= </constructor-arg> <!-- password --> <constructor-arg type="java.lang.String"> <value>jxg/Qr4VbxU= </constructor-arg> <!--...
<constructor-arg><ref bean="helloService"/></constructor-arg> ``` 对应的类`ConstructorHelloAction`中,我们需要创建一个带参数的构造函数来接受注入的对象: ```java private HelloServiceImpl ...
</constructor-arg> <constructor-arg> <constructor-arg> <value>http</value> </constructor-arg> <constructor-arg> <value>8080 </constructor-arg> </constructor-arg> ``` 步骤三:定义Reslet...
这通常通过`<object>`标签实现,指定`type`属性为要创建的对象类型,并可以使用`constructor-arg`子元素提供构造函数参数。例如: ```xml , MyAssembly"> <constructor-arg index="0" value="param1"/> ...
通过 `<property>` 或 `<constructor-arg>` 标签,我们可以将依赖注入到 Bean 中。这使得我们的代码更加灵活,易于测试和维护。 在不使用注解的情况下,我们还需要使用 Spring 容器(ApplicationContext)来加载 ...
<constructor-arg name="client" ref="client"/> <bean id="client" class="org.springframework.data.elasticsearch.client.ClientConfigurationBuilder" factory-method="build"> <constructor-arg> <value>...
内部Bean是指在或<constructor-arg>元素中使用元素再定义一个Bean。内部Bean的scope、id、name属性会被忽略,内部Bean总是prototype(原型)模式,内部Bean不能在包含该内部Bean的Bean之外依赖注入。 集合依赖注入 ...