什么是依赖注入?通俗来说,就是创建一个对象时,把其成员变量也都给赋值。而注入方式主要有3种:①原理是通过类的构造函数来创建的(基于XML)。②原理是通过类的set方法来构造的(基于XML)。③就是通过注解的方式来获得。当然根据注入数据的不同,每种方式又有不同的方法:①基本数据和String类型、②IoC中注册的Bean类型、③Array、List、Set、Map、Properties等复杂类型
注:依赖注入是在IoC的基础上进行的,即无论采用何种方式进行注入,首先得把IoC相关的东西写好。(详情可见https://blog.csdn.net/m1179457922/article/details/107511502)
(1)通过类的构造函数
首先,既然是通过类的构造函数,那么类必须要有一个对应的构造函数
public class Student {
String name;
public Student() {
System.out.println("Student 无参构造器");
}
//关键
public Student(String name) {
this.name = name;
System.out.println("Student 有参构造");
}
@Override
public String toString() {
return "Student [name=" + name + "]";
}
}
通过构造函数是在配置文件中的<bean>标签下使用子标签<constructor-arg>,属性值name是成员变量的名称(成员变量和name值的首字母最好都小写,符合命名规范),不同的数据类型使用不同的属性值来进行注入:
基本数据类型和String类型,使用value属性来指定
<bean id="Student" class="Test.Student">
<constructor-arg name="name" value="MMM"></constructor-arg>
</bean>
IoC中存在的Bean,使用ref属性来指定
<bean id="Cat" class="Test.Cat"></bean>
<bean id="Student" class="Test.Student">
<constructor-arg name="name" value="MMM"></constructor-arg>
<constructor-arg name="cat" ref="Cat"></constructor-arg>
</bean>
复杂类型的数据,在<constructor-arg>标签下面还有对应类型的子标签。Array、List、Set都是使用该类型的子标签<value>的标签体来加入基本数据类型及其包装类或者String,或者<ref bean="id">来指定Bean(Array、List、Set可以混用)
<bean id="Student" class="Test.Student">
<constructor-arg name="name" value="MMM"></constructor-arg>
<constructor-arg name="cats">
<list>
<ref bean="Cat1"/>
<ref bean="Cat2"/>
<ref bean="Cat3"/>
</list>
</constructor-arg>
</bean>
对于Map和Properties也可以混用,因此记住Map即可。
<bean id="Student" class="Test.Student">
<constructor-arg name="name" value="MMM"></constructor-arg>
<constructor-arg name="cats">
<map>
<entry key-ref="" value-ref=""></entry>
</map>
</constructor-arg>
</bean>
如果是基本数据类型或者String,则将key-ref或value-ref改为key或者value
(2)通过set方法注入
通过构造方法注入,虽然可行,但是需要创建一个构造方法,而有时候构造方法不便对外可见。因此,就出现了另一种方法即通过set方法。因此类中必须有对应的set方法
(注:按照命名规范是没有问题的,但是实际上是调用了setXXX()方法,XXX是你指定的name的首字母大写)
通过set方法注入配置只是将<constructor-arg>换成了<property>
<bean id="Student" class="Test.Student">
<property name="name" value="Moze"></property>
</bean>
(3)基于注解的方法注入
注解注入你也可以在xml中注册下Bean,然后再再类上使用注解注入(要打开注解扫描)
首先是介绍相关的注解。第一个是@Value("值"),使用在基本数据类型或者String类型上。
@Value("Moze")
String name;
注解不能够给复杂数据类型注入。因此现在只剩bean数据了,其较为复杂,共分为三个,@Autowired、@Qualifier、@Resource。这三个使用方法是一致的,但是原理有所不同
@Autowired
Cat cat;
@Autowired:自动按照类型注入。如果说IoC中只有一个该类型或者实现类的对象,那么匹配该对象。如果有多个,那就按照类的对象名去IoC容器中匹配对应的id,如果找到则注入,找不到则返回。
@Qualifier("id"):必须与Autowired连用,先按照类型匹配,有多个匹配的后,会使用id(而不是对象名)去匹配IoC容器
@Resource(name="id"):先按照id来匹配,如果匹配失败,再按照类型匹配。
因此@Resource和@Autowired使用较多,且@Resource较为方便
总结:至此能够完成对象的注入