两种注入方式介绍
DI(Dependency Injection)依赖注入 。
依赖注入,即组件之间的依赖关系由容器在应用系统运行期来决定,也就是由容器动态地将某种依赖关系的目标对象实例注入到应用系统中的各个关联的组件之中。
简单来说,所谓的依赖注入其实就是,在创建对象的同时或之后,如何给对象的属性赋值。
如果对象由我们自己创建,这一切都变得很简单,例如:
或者:
如果对象由spring创建,那么spring是怎么给属性赋值的?spring提供两种方式为属性赋值:
(1).Set方式注入
(2).构造方法注入(spring大都使用这种方式)
1、set方式注入
普通属性注入
需求:通过Spring创建User实例,并为User实例的name和age属性(普通属性)赋值
1)、创建User类,声明name和age属性,并添加对应的setter和getter方法,以及toString方法
2)、在applicationContext.xml中声明User类的bean实例
3)、创建测试类—TestDI
由于这里没有为User对象的属性赋值,所以此时运行测试,结果为:
4)、修改applicationContext.xml中User实例的声明,为User实例注入属性
其中name属性的值,必须要和User类中所注入属性对应的get方法的名字去掉get后首字母变为小写的名字相同。
例如:为 User类中的age属性赋值,由于name属性对应的get方法名字为 getAge,当去调用get和 首字母变为小写后的名称为age,因此为age属性注入的配置内容为:
普通属性直接通过value注入即可。
5)、运行测试类TestDI,结果为:
上面通过spring提供的set方式对User对象的属性进行了赋值赋值,所以此时运行测试,结果为:
2、对象属性注入
需求:通过Spring创建User实例,并为User对象的userInfo属性(对象属性)赋值
1)、创建UserInfo类
2)、在applicationContext.xml中,声明UserInfo类的bean实例
3)、修改User类,声明userInfo属性,添加对应的setter和getter方法,并重新生成toString方法
4)、在applicationContext.xml中,将UserInfo对象作为值,赋值给User对象的userInfo属性
由于此处是将UserInfo对象作为值赋值给另一个对象的属性,因此ref属性的值,为UserInfo对象bean标签的id值。
对象属性通过ref属性注入。
5)、运行测试类TestDI,结果为:
3、构造方法注入
需求:通过Spring创建User对象,并为User对象的属性(name、age、UserInfo属性)赋值
1)、为User类声明构造函数
2)、修改applicationContext.xml文件,将set方式修改为构造方法注入。
其中,constructor-arg标签name属性的值必须和构造函数中参数的名字相同!
同样的,普通属性直接通过value注入即可;
对象属性通过ref属性注入。