bean可以这样配置:
1.引用bean
<bean id="car" class="com.Car"></bean>
<bean id="boss" class="com.Boss">
<property name="car">
<ref bean="car"></ref>
</property>
<property name="phone">
<value>110</value>
</property>
</bean>
2.静态工厂方法
<bean id="People2" class="com.Factory" factory-method="create"></bean>
<bean id="factory" class="com.Factory"></bean>
<bean id="People3" factory-bean="factory" factory-method="create2"></bean>
4.循环依赖问题
Car的构造函数传入一个Boss实例,Boss的构造函数传入一个Car实例。
这样就不能使用构造函数注入了,而应使用属性注入方式。
5.构造函数传入bean
<bean id="boss1" class="com.baobaotao.ditype.Boss">
<constructor-arg>
<value>John</value>
</constructor-arg>
<constructor-arg>
<ref bean="car" />
</constructor-arg>
<constructor-arg>
<ref bean="office" />
</constructor-arg>
</bean>
<bean id="car" class="com.baobaotao.ditype.Car"
p:brand="红旗&CA72"
p:maxSpeed="200"
p:price="20000.00"/>
<bean id="office" class="com.baobaotao.ditype.Office" />
//这里p是这样来的
xmlns:p="http://www.springframework.org/schema/p"
构造函数还可以这样注入:
<!--构造函数注入:type -->
<bean id="car1" class="com.baobaotao.ditype.Car">
<constructor-arg type="java.lang.String">
<value>红旗CA72</value>
</constructor-arg>
<constructor-arg type="double">
<value>20000</value>
</constructor-arg>
</bean>
<!--
构造函数注入:index <bean id="car2" class="com.baobaotao.ditype.Car">
<constructor-arg index="0" value="红旗CA72" /> <constructor-arg
index="1" value="中国一汽" /> <constructor-arg index="2" value="20000" />
</bean>
-->
<!--构造函数注入:type&index -->
<bean id="car3" class="com.baobaotao.ditype.Car">
<constructor-arg index="0" type="java.lang.String">
<value>红旗CA72</value>
</constructor-arg>
<constructor-arg index="1" type="java.lang.String">
<value>中国一汽</value>
</constructor-arg>
<constructor-arg index="2" type="int">
<value>200</value>
</constructor-arg>
</bean>
其中Car的构造函数这样的:
public Car() {}
public Car(String brand, double price) {
this.brand = brand;
this.price = price;
}
public Car(String brand, String corp, double price) {
this.brand = brand;
this.corp = corp;
this.price = price;
}
public Car(String brand, String corp, int maxSpeed) {
this.brand = brand;
this.corp = corp;
this.maxSpeed = maxSpeed;
}
----------------------------------------------我就是一条分割线,重点看下面---------------------------------------------
一些细节:
1.属性变量名有一个很容易被忽视的命名规范,前两个字母或者全部大写,或者全部小写。否则会报编译错误。或者说,这个命名,其对应的方法自动生成,不会与配置文件发生冲突。
2.若是要给某个元素配空值,则需借助<null/>标签。
3.级联属性
若是希望初始化Boss,直接给Car属性注入值
<bean id="boss" class="com.Boss">
<property name="car.brand" value="长安"></property>
</bean>
则应当改造Boss类
public class Boss
{
private Car car=new Car();
......
}
必须提供一个非空的Car实例,若是没有为car属性提供Car对象,Spring设置级联属性便会抛出NullValueInNestedPathException的异常。
4.集合类型属性
比如Boss类里面,含有一个 List 类型的 favorities 属性,则需要这样配。
<bean id="parentBoss" abstract="true"
class="com.baobaotao.attr.Boss">
<property name="favorites">
<set>
<value>看报</value>
<value>赛车</value>
<value>高尔夫</value>
</set>
</property>
</bean>
<bean id="childBoss" parent="parentBoss">
<property name="favorites">
<set merge="true">
<value>爬山</value>
<value>游泳</value>
</set>
</property>
</bean>
上述代码同时涉及到了集合的合并。
集合合并分三步,1.定义父bean 2.子bean指定父bean 3.和父bean中同名的属性值进行合并。即子集拥有五个元素。
List属性既可以通过<value>注入字符串,也可以通过<ref>注入容器中其他的Bean。数组类型的属性(如String[ ] , int [ ] 等)也可以采用<list>的方式进行配置。
5.通过 util 命名空间配置集合类型的 bean
若是希望配置一个集合类型的Bean,而不是一个集合类型的属性,则可以通过 util 命名空间进行配置。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<!-- bean definitions here -->
</beans>
之前是这样:
<!-- creates a java.util.List instance with values loaded from the supplied 'sourceList' -->
<bean id="emails" class="org.springframework.beans.factory.config.ListFactoryBean">
<property name="sourceList">
<list>
<value>pechorin@hero.org</value>
<value>raskolnikov@slums.org</value>
<value>stavrogin@gov.org</value>
<value>porfiry@gov.org</value>
</list>
</property>
</bean>
现在是这样:
<util:list id="emails">
<value>pechorin@hero.org</value>
<value>raskolnikov@slums.org</value>
<value>stavrogin@gov.org</value>
<value>porfiry@gov.org</value>
</util:list>
其他的类似,参考官方文档。
6.采用p命名空间后,用 p 配置属性字面值,配置属性引用对象值。简化配置代码。
<bean id="car" class="com.baobaotao.injectfun.Car" p:brand="红旗CA72" p:price="2000" scope="prototype"/>
<bean id="boss" class="com.Boss" p:car-ref="car"/>