1.依赖注入(DI)是什么
依赖注入(Dependency Injection)简称DI,是Spring IOC(控制反转)容器中一个非常重要的知识点,也是面试中常考的点。依赖注入(DI)是一个Spring IOC容器通过构造器实例化该Bean构造函数的参数,或是设置该Bean的成员属性的过程。简单来说就是为创建对象时给带参数的构造方法传入参数或者给对象的某些属性赋值。
上述解释可能还是难以理解,我们也可以把依赖注入拆开分成依赖(dependency)和注入(injection)来解释。依赖什么呢?依赖就是类(bean)的创建,管理依赖Spring IOC容器。注入又是什么呢?注入是给带参构造方法注入需要的参数或者为类的一些成员变量赋值。
2.使用依赖注入好处
1)使用依赖注入让代码更整洁,对Spring中的对象(bean)起到良好的解耦的作用,类中依赖了其他类或属性,不需要去查找位置或类。
2)使得类的测试更为简单,直接通过getBean()方法获取类的实例化对象。
3.实现依赖注入的两种主要方式
3.1基于构造函数的依赖关系注入
Spring IOC容器创建类对象(bean)时默认使用无参构造方法,如果实体类使用了带参构造方法而不在Spring的XML配置文件配置,无法正常初始化对象,测试时会报以下错误:
1)构造函数参数引入其他类(bean)
实体类User代码如下:
public class User {
private String name;
private Integer age;
//定义Address为成员变量
private Address address;
//构造函数引入了Address类
public User(Address address) {
this.address = address;
}
}
XML配置文件主要内容如下:
<!-- 定义Address类配置 -->
<bean id="ar" class="com.hebeu.pojo.Address">
<property name="address" value="西安"></property>
</bean>
<!-- 定义User类配置 -->
<bean id="user" class="com.hebeu.pojo.User">
<!-- 指定引入类的id -->
<constructor-arg ref="ar"></constructor-arg>
</bean>
2)构造函数参数类型匹配
根据构造函数参数类型匹配,如int;String;boolean等类型。实体类User代码如下:
//User类中的成员变量和有参构造方法
public class User {
private String name;
private Integer age;
private String sex;
public User(String name) {
this.name = name;
System.out.println("name:" +name);
}
}
XML配置文件主要内容如下:
<!-- 2.构造函数参数类型匹配,此处参数name应该指定String类型,但不推荐,可能存在类型相同的参数如两个String类型-->
<constructor-arg type="java.lang.String" value="韶涵"></constructor-arg>
3)构造函数参数索引匹配
User实体类有参构造方法name也可以指定name参数的下标,从0开始。XML配置文件主要内容如下:
<!-- 3.通过构造函数参数索引解析,就是参数的先后顺序 -->
<constructor-arg index="0" value="李易峰"></constructor-arg>
4)构造函数参数名称匹配
根据构造函数传入参数名称,此处是String类型的name。XML配置文件主要内容如下:
<!-- 4.构造函数参数名称解析-->
<constructor-arg name="name" value="章"></constructor-arg>
3.2基于类中Setter方法的依赖关系注入
Setter方法注入就是Spring IOC容器通过无参构造函数实例化bean后调用实体类中属性set方法为成员变量赋值,成员变量类型(基本类型及引用类型;数组类型;Set;Map;List等)不同就有以下八种主要的注入方法。新建了上述类型的Student实体,具体代码如下:
//实体Student
public class Student {
//直值(字符串等)
private String name;
//引用对象类型
private Address address;
//数组类型
private String[] books;
//List类型
private List<String> hobby;
//Map类线
private Map<String, String> card;
//Set类型
private Set<String> games;
//Properties配置类型
private Properties info;
//字符串要设置为空值
private String wife;
}
下面XML配置和Student属性一一对应,具体属性配置代码如下:
1)第一种,直接值简单注入
<!--直接值简单注入-->
<property name="name" value="毛不易"></property>
2)第二种,bean类的引用注入
<!-- bean类的引用注入-->
<property name="address" ref="address"></property>
3)第三种,数组类型属性注入
<!-- 数组类型属性注入 -->
<property name="books">
<array>
<value>西线无战事</value>
<value>花好月圆</value>
<value>乔布斯传</value>
</array>
</property>
4)第四种,List集合类型属性注入
<!--集合类型属性注入 -->
<property name="card">
<map>
<entry key="身份证" value="1111313424"></entry>
<entry key="银行卡" value="1111"></entry>
</map>
</property>
5)第五种,Map集合类型属性注入
<!-- Set集合类型属性注入-->
<property name="games">
<set>
<value>LOL</value>
<value>CF</value>
<value>wpw</value>
</set>
</property>
6)第六种,Set集合类型属性注入
<!-- List集合类型属性注入-->
<property name="hobby">
<list>
<value>听歌</value>
<value>coding</value>
<value>看书</value>
</list>
</property>
7)第七种,Properties配置类型属性注入
<!-- Properties配置类型属性注入-->
<property name="info">
<props>
<prop key="url">http://localhost:9999/baidu.com</prop>
<prop key="name">root</prop>
<prop key="passwors">root</prop>
</props>
</property>
8)第八种,空字符串注入
<!-- 空字符串注入-->
<property name="wife">
<null/>
</property>
4.总结
学习了Spring依赖注入知识点,写此博客记录重要的概念及方法,方便后面阅读和学习。如有错误或改进的地方请大家指出,我会改进的,一起加油吧!