两种注入形式

DI(Dependency Injection)依赖注入 。

依赖注入,即组件之间的依赖关系由容器在利用零碎运行期来决定,也就是由容器动静地将某种依赖关系的指标对象实例注入到利用零碎中的各个关联的组件之中。

所谓的依赖注入其实就是,在创建对象的同时或之后,如何给对象的属性赋值。
如果对象由咱们本人创立,这所有都变得很简略,例如:

User user = new User();user.setName("小智"); //通过setName办法为name属性赋值user.setAge(24); //通过setAge办法为age属性赋值

或者:

User user = new User("小智", 24); //在创建对象的同时,通过有参构造函数为对象的属性赋值

若是对象由Spring IoC容器创立,Spring提供两种形式为属性赋值:

1)set办法注入
2)构造方法注入
set办法注入
顾名思义,就是在类中提供须要注入成员的 set 办法。spring框架底层会调用set办法为成员变量赋值。
例如:Spring框架负责创立User的Bean对象之后,会通过调用User对象的setName办法为name属性赋值。
一般属性注入
需要:通过Spring IoC容器获取User实例,并为User对象的name和age属性(一般属性)赋值
1、在User类中申明name和age属性,并增加对应的setter和getter办法,以及重写toString办法

public class User {//提供公有成员变量private String name;private Integer age;private UserInfo info;//提供getter和setter办法...//重写toString办法...}

2、在beans.xml中申明User类的bean实例

<!-- 将User类作为bean拆卸到Spring IoC容器中(即User类的实例由Spring创立) --><bean id="user" class="com.tedu.pojo.User"></bean>

3、创立测试类—DITest

package com.tedu;import org.Springframework.context.support.ClassPathXmlApplicationContext;public class DITest {@Testpublic void testDI() {// 获取Spring的IoC容器ApplicationContext ctx = newClassPathXmlApplicationContext("beans.xml");// 应用getBean办法获取对应的POJO并输入User user = (User)ctx.getBean( "user" );System.out.println( user );}}

因为这里没有为User对象的属性赋值,所以此时运行测试,后果为:

User[name=null,age=null,info=null]

4、批改beans.xml中User Bean标签,为User Bean的name和age属性注入属性值

<!-- 将User类作为bean拆卸到Spring IoC容器中(即User类的实例由Spring创立) --><bean id="user" class="com.tedu.pojo.User"><!-- 通过set办法为User Bean的name、age属性赋值 --><property name="name" value="小智"/><property name="age" value="24"/></bean>

下面的bean定义表明,User bean通过 <property> 标签为User对象的 name 和 age 属性赋值。
之所以称之为是set办法注入,是因为在框架底层会调用User对象的setter办法为属性赋值。
例如:上面User bean标签中的 <property> 标签是为User对象的属性赋值。

<property name="name" value="小智"></property>

因为 name=" name ",因而须要User对象中有setName办法才能够实现注入,否则将会注入失败。
value=" 小智 ",示意为(User对象的) setName 办法对应的属性赋值为" 小智"。

一般属性(根本数据类型和String类型)间接通过value注入即可。

5、运行测试类DITest,后果为:

User[name="小智",age=24,info=null]

对象属性注入
需要:通过Spring IoC容器获取User实例,并为User对象的userInfo属性(对象属性)赋值

1、在beans.xml中,将UserInfo类作为bean拆卸到Spring IoC容器中(如果已有能够疏忽)

<!-- 将UserInfo类作为bean拆卸到Spring IoC容器中(即UserInfo类的实例由Spring创立) --><bean id="userInfo" class="com.tedu.pojo.UserInfo"></bean>

2、在beans.xml中,将通过 Spring 容器获取的UserInfo对象作为值,注入到User对象的userInfo属性

<!-- 将User类作为bean拆卸到Spring IoC容器中(即User类的实例由Spring创立) --><bean id="user" class="com.tedu.pojo.User"><!-- 通过set办法为User Bean的name、age属性赋值 --><property name="name" value="小智"/><property name="age" value="24"/><!-- 通过set办法为User Bean的info(对象)属性赋值 --><property name="info" ref="userInfo"/></bean><!-- 将UserInfo类作为bean拆卸到Spring IoC容器中(即UserInfo类的实例由Spring创立) --><bean id="userInfo" class="com.tedu.pojo.UserInfo"></bean>

因为此处是将UserInfo对象的援用作为值设置给info属性,因而 ref 属性指定为UserInfo对象bean标签的id值。将通过 Spring 容器获取的UserInfo对象传递给setUserInfo办法,从而对User对象的属性赋值。

对象属性通过ref属性注入。

3、运行测试类DITest,后果为:

User[name="小智",age=24,info=com.tedu.pojo.Userinfo@65e2dbf2]

构造方法注入
顾名思义,就是应用类中的构造函数,为成员变量赋值——即构造方法注入。
须要留神的是:为成员变量赋值是通过配置的形式,让spring框架在创立bean对象的同时,为成员变量赋值。而不是咱们本人去实现。
需要:通过Spring IoC容器获取User实例,并为User对象的name、age、info属性赋值

1、为User类增加无参结构和有参构造函数

//提供无参结构public User() { }//提供有参结构public User(String name, Integer age, UserInfo info) {this.name = name;this.age = age;this.info = info;}

留神:如果不增加有参构造函数,能够无参、有参构造函数都不增加;

如果要增加有参构造函数,强烈建议同时增加无参构造函数,否则在很多中央应用时都可能会抛出异样!

2、批改beans.xml文件,将set办法批改为构造方法注入。

<!-- 将User类作为bean拆卸到Spring IoC容器中(即User类的实例由Spring创立) --><bean id="user" class="com.tedu.pojo.User"><!-- 通过set办法为User Bean的name、age属性赋值<property name="name" value="小智"/><property name="age" value="24"/> --><!-- 通过set办法为User Bean的info(对象)属性赋值<property name="info" ref="userInfo"/> --><!-- 通过构造方法为User Bean的name、age、info属性赋值 --><constructor-arg name="name" value="马云"/><constructor-arg name="age" value="30"/><constructor-arg name="info" ref="userInfo"/></bean><!-- 将UserInfo类作为bean拆卸到Spring IoC容器中(即UserInfo类的实例由Spring创立) --><bean id="userInfo" class="com.tedu.pojo.UserInfo"></bean>

其中,constructor-arg标签name属性的值必须和构造函数中参数的名字雷同!

同样的,一般属性间接通过value注入即可;对象属性通过ref属性注入。

3、运行测试类DITest,后果为:
User[name=马云,age=30,info=com.tedu.pojo.UserInfo@7e3f631b]