1、注入方式
bean的构造函数用到下面两个属性 public XXXX(String message, int value) {……}
#构造器注入
<bean name="XXX" class="XXXX">
<!-- 索引方式-->
<constructor-arg index="0" value="Hello Kris!"/>
<constructor-arg index="1" value="150"/>
<!-- 参数类型方式-->
<constructor-arg type="java.lang.String" value="Hello Kris!"/>
<constructor-arg type="int" value="150"/>
<!-- 参数名称方式-->
<constructor-arg name="message" value="Hello Kris!"/>
<constructor-arg type="value" value="150"/>
</bean>
#静态工厂注入
//静态工厂类
public class InjectClassByStaticFactory {
public static BeanType newInstance(String message, int index) {
return new BeanTypeImpl(message, index);
}
}
<bean name="beanType" class="InjectClassByStaticFactory" factory-method="newInstance">
<!-- 构造器-->
<constructor-arg index="0" value="Hello Kris!"/>
<constructor-arg index="1" value="150"/>
</bean>
#实例工厂注入
//实例工厂类
public class InjectClassByInstanceFactory {
public BeanType newInstance(String message, int index) {
return new BeanTypeImpl(message, index);
}
}
<bean name="instanceFactory" class="InjectClassByInstanceFactory"/>
<bean name="beanType" factory-bean="instanceFactory" factory-method="newInstance">
<!-- 构造器-->
<constructor-arg index="0" value="Hello Kris!"/>
<constructor-arg index="1" value="150"/>
</bean>
#setter注入 是通过在通过构造器、静态工厂或实例工厂实例好Bean后,通过调用Bean类的setter方法进行注入依赖
<bean name="XXX" class = "XXXX">
<property name="YYY" value="YYYY"
</bean>
2、Bean的注入
1)常量注入:
<bean id="bean2" class="cn.javass.spring.chapter3.bean.BooleanTestBean">
<property name="success" value="on"/>
</bean>
2)注入Bean ID,注入Bean的ID,ID是一个常量不是引用,且类似于注入常量,但提供错误验证功能
<bean id="bean1" class="java.lang.String">
<constructor-arg index="0" value="test"/>
</bean>
<bean id="idrefBean1" class="cn.javass.spring.chapter3.bean.IdRefTestBean">
<property name="id"><idref bean="bean1"/></property>
</bean>
3)注入集合
# List类型 使用list标签
<bean name="XXX" class=""XXX>
<property name = "instanceList">
<list value-type="String" merge="default">
<value>1</value>
<value>2</value>
</list>
</property>
</bean>
注:当使用value-type时,bean类中,要指定变量的泛型。private List<String> instanceList;
#Set类型 使用set标签
<bean name="XXX" class=""XXX>
<property name = "instanceSet">
<set>
<value>1</value>
<value>2</value>
</set>
</property>
</bean>
#Collection类型 Collection类型是Set和List类型的基类型,使用list和set标签都可以
4)注入数组 array标签
#一维数组
<bean name="XXX" class=""XXX>
<property name = "oneArray">
<array value-type="String" merge="default">
<value>1</value>
<value>2</value>
</array>
</property>
</bean>
#二维数组
<bean name="XXX" class=""XXX>
<property name = "twoArray">
<array>
<array>
<value>1</value>
<value>2</value>
</array>
<array>
<value>3</value>
<value>4</value>
</array>
</array>
</property>
</bean>
5)注入字典(Map) 使用<map>标签,<key>子标签来指定键数据,<value>子标签来指定键对应的值数据
<bean name="XXX" class= "XXX">
<property name ="instanceMap" key-type="java.lang.String" value-type="java.lang.String">
<!-- 第一种方式-->
<entry>
<key>
<value>1</value>
<key>
<value>22</value>
</entry>
<!-- 第二种方式-->
<entry key="2" value="33"/>
</property>
</bean>
6)注入java.util.Properties类型数据,使用<props>标签,键和值类型必须是String,子标签<prop key=”键”>值</prop>来指定键值对
<bean name="XXX" class= "XXX">
<property name ="instanceProps">
<props value-type="int" merge="default"> <!-- 尽管指定了int类型,但不起作用。仍然是String类型-->
<prop key="1">test</prop>
<prop key="2">test2</prop>
</props>
</property>
</bean>
7)注入bean
#构造器方式
<bean name="XXX" class="XXXX">
<!-- 第一种方式 ref属性指定引用其它bean-->
<constructor-arg index="0" ref="xxxBean"/>
<!-- 第二种方式 子<ref>标签来引用其它Bean-->
<constructor-arg index="0">
<ref bean="xxxBean"/>
</constructor-arg>
<constructor-arg index="1" value="150"/>
</bean>
<bean id="xxxBean" class="XXXBean"/>
#setter方式
<bean name="XXX" class="XXXX">
<!-- 第一种方式 ref属性指定引用其它bean-->
<property name="XXX" ref="xxxBean"/>
<!-- 第二种方式 子<ref>标签来引用其它Bean-->
<property name="XXX">
<ref bean="xxxBean"/>
</property>
<property name="tt" value="test"/>
</bean>
<bean id="xxxBean" class="XXXBean"/>
#其它方式
|*| <ref local=""> 用于在当前配置文件中引用通过<bean id=”beanName”>方式中通过id属性指定的Bean。 必
须指定id属性,必须在当前配置文件
|*| <ref parent=""/>引用父容器中的Bean,不会引用当前容器中的Bean。父容器中的Bean和当前容器的Bean是可以重名
#内部Bean,指<property>或<constructor-arg>内通过<bean>标签定义的Bean,对其他外部Bean不可见
<bean name="XXX" class="XXXX">
<constructor-arg index="0">
<bean name="innerBean1" class="XXXXXXXX">
</constructor-arg>
<property name="prop">
<bean name="innerBean2" class="XXXXXXXX2">
</property>
</bean>
8)注入null值,使用null标签
<bean name="XXX" class="XXXX">
<property name="prop"><null/></property>
<bean>
9)对象图导航注入,指类似a.b.c这种点缀访问形式的访问或修改值。a和b必须为非null值才能注入c
%%%%%%%通常不使用%%%%%%%
code代码:
public class C {
public void say() {
System.out.println("=== c");
}
}
public class B {
private C c;
private List<C> list;
private Properties properties;
private C[] array = new C[1];
private Map<String, C> map;
…… //setter/getter方法
}
public class A {
private B b;
public void setB(B b) {
this.b = b;
}
}
配置文件:
<bean id="c" class="C"/>
<bean id="b" class="B">
<property name="list"><list></list></property>
<property name="map"><map></map></property>
<property name="properties"><props></props></property>
</bean>
<bean id="a" class="A">
<!-- 首先注入B 确保它非空 -->
<property name="b" ref="b"/>
<!-- 对象图导航注入 -->
<property name="b.c" ref="c"/>
<!-- 注入列表数据类型数据 -->
<property name="b.list[0]" ref="c"/>
<!-- 注入map类型数据 -->
<property name="b.map[key]" ref="c"/>
<!-- 注入properties类型数据 -->
<property name="b.properties[0]" ref="c"/>
<!-- 注入properties类型数据 -->
<property name="b.properties[1]" ref="c"/>
<!-- 注入数组类型数据 ,注意不要越界-->
<property name="b.array[0]" ref="c"/>
</bean>
4、Spring创建Bean的原理
Spring容器创建"A" Bean,首先去“当前创建Bean池”查找是否当前Bean正在创建,如
果没发现,则继续准备其需要的构造器参数“B”,并将“A” 标识符放到“当前创建Bean池”;
当创建完B时,再去创建A
转载请注明:http://blog.csdn.net/coolwzjcool/article/details/9789279