spring3笔记3-DI注入

来源:互联网 发布:淘宝购物车排序 编辑:程序博客网 时间:2024/06/03 21:34

Spring IoC容器注入依赖资源主要有以下几种基本实现方式:

构造器注入:就是容器实例化Bean时注入那些依赖,通过在在Bean定义中指定构造器参数进行注入依赖,包括实例工厂方法参数注入依赖,但静态工厂方法参数不允许注入依赖;

setter注入通过setter方法进行注入依赖;

方法注入能通过配置方式替换掉Bean方法,也就是通过配置改变Bean方法 功能。


1.构造器注入实例化与传统实例化比较:

以下面JavaBean类为例:

//参数名注入是有限制的,需要使用在编译程序时打开调试模式@java.beans.ConstructorProperties({"message", "index"}) public class JavaBean{
private String message;
private int index;
private List<String> names;
private Collection<String> values;
private String[] arr1;
private String[][] arr2;
private Map<String, String> map1;
private Properties props;
public JavaBean(message, index){
this.index = index;
this.message = message;
}
public void setMessage(String message){
this.message = message;
}
public void setIndex(int index){
this.index = index;
}
public void setNames(List<String> names){
this.names = names;
}
public void setValues(Collection<String> values){
this.values = values;
}
public void setArr1(String[] arr1){
this.arr1 = arr1;
}
public void setArr2(String[][] arr2){
this.arr2 = arr2;
}
public void setMap1(Map<String, String> map1){
this.map1 = map1
}
public void setProps(Properties props){
this.props = props;
}
public sayHello(){
System.out.println(message + "......." + index);
}
}

//传统:JavaBean bean = new JavaBean(paramValue1,paramValue2); 

//构造器:

//根据参数索引注入:

<bean id="byIndex" class="...../JavaBean">
<constructor-arg index="0" value="paramValue1"/>
<constructor-arg index="1" value="paramValue2"/>
</bean>

//根据参数类型注入:

<bean id="byType" class="...../JavaBean">
<constructor-arg type="java.lang.String" value="paramValue1"/>
<constructor-arg type="java.lang.Integer" value="paramValue2"/>
</bean>

//根据参数名称注入

<bean id="byName" class="...../JavaBean">
<constructor-arg name="message" value="paramValue1"/>
<constructor-arg name="index" value="paramValue2"/>
</bean>


//实例化类JavaBean:

BeanFactory beanFactory = new ClassPathXmlApplicationContext("...././constructorDependencyInject.xml");//获取根据参数索引依赖注入的Bean
JavaBean byIndex = beanFactory.getBean("byIndex", JavaBean.class);
byIndex.sayHello();
//获取根据参数类型依赖注入的Bean
JavaBean byType= beanFactory.getBean("byType", JavaBean.class);
byIndex.sayHello();
//获取根据参数名称依赖注入的Bean
JavaBean byName= beanFactory.getBean("byName"JavaBean.class);
byIndex.sayHello();


2.静态工厂类

StaticFactoryBean

public class StaticFactoryBean{public static JavaBean newInstance(String message, int index){return new JavaBean(message, index);}}

同上三种方式:

<bean id="factoryName" class="...../StaticFactoryBean">
<bean id="byName" factory-bean="factoryName"  factory-method="newInstance">
<constructor-arg name="message" value="paramValue1"/>
<constructor-arg name="index" value="paramValue2"/>
</bean>

3.setter注入:

传统setter方法:

JavaBean javaBean = new JavaBean();javaBean.setMessage("hello");javaBean.setIndex(1);

setter注入方式:

<bean id="beanName" class="...../JavaBean">

<!-- boolean类型的值可以用 on/off 或者 yes/no 或者 1/0 -->

<property name="message" value="Hello World!"/>
<property name="index">

<value>1</value>

</property>
<!-- 注入list -->

<property name="names">

<list value-type="java.lang.String" merge="default">
<!-- value-type不指定,则默认为String,merge用于父子bean关系时,是否合并list -->

<value>老王</value>
<value>老李</value>
<value>老张</value>

</list>

</property>
<!-- 注入set -->
<property name="values">

<set value-type="java.lang.String" merge="default">

<value>小王</value>
<value>大王</value>
<value>老王</value>

</set>

</property>
<!-- 注入一维数组 -->
<property name="arr1">

<array value-type="java.lang.String" merge="default">

<value>1</value>
<value>2</value>
<value>3</value>

</array>

</property>
<!-- 注入二维数组 -->
<property name="arr2">

<array>

<array>

<value>1</value>
<value>2</value>

</array>

</array>
<array>

<array>

<value>3</value>

<value>4</value>

</array>

</array>
.........

</property>
<!-- 注入字典(Map)类型 -->
<property name="map1">

<map key-type="java.lang.String" value-type="java.lang.String">

<entry>

<key><value>name</value></key>
<value>老王</value>

</entry>
<entry key="age" value="23" />

</map>

</property>
<!-- 注入Properties -->
<property name="props">

<props value-type="int" merge="default">
<!-- 这里的value-type并不起什么作用,默认String类型 -->

<prop key="name">老王</key>
<prop key="msg">你好!</key>

</props>

</property>
<!-- 还可以使用以下方法 -->
<property name="props">

<value>

name=老王;
msg=你好!
<!-- 属性分隔符可以是回车,分号,逗号 -->

</value>

</property>

</bean>
参考(导航配置及以上相关简写):http://jinnianshilongnian.iteye.com/blog/1415277

// 实例化

BeanFactory beanFactory = new ClassPathXmlApplicationContext("...././constructorDependencyInject.xml");
HelloApi bean = beanFactory.getBean("bean", HelloApi.class);
bean.sayHello();

注入bean的id

<property name="id"><idref bean="bean1"/></property><property name="id"><idref local="bean2"/></property><!-- 同下 --><bean id="bean1" class="....."><bean id="idrefbean" class=".....">
<property name="id" value="bean1"></property>

</bean>


例子:

<bean id="bean1" class="......">
<constructor-arg index="0" value="test"/>

</bean><bean id="bean1" class=".....">
<property name="id">
<idref bean="bean1"/>
</property>

</bean>