
3.4 Spring IoC的依赖注入方式
Spring通过依赖注入实现IoC,常用的依赖注入方式有三种:Setter方法依赖注入、构造方法依赖注入和注解依赖注入。
实际上,依赖注入(Dependency Injection,DI)和IoC是同一个概念,因为在ApplicationContext.xml配置文件中,Bean和Bean之间通过REF来维护的时候是相互依赖的,所以叫作依赖注入,也就是反转控制。
简而言之,在通常情况下,一个类不能完成复杂的业务处理,会有多个类一起合作完成,就会出现在一个类中调用另外一个类的方法,此时需要给依赖的对象赋值,也就是在程序运行过程中动态地给组件(成员变量)赋值,这种方式就叫作依赖注入。
3.4.1 Setter方法依赖注入

Setter方法依赖注入在实际项目开发中有非常广泛的应用。Setter方法依赖注入比较直观,把需要注入的类写成属性,给它设置一个Set方法即可,实现代码如下:

在配置文件中将类B注入类A中,代码如下:

3.4.2 构造方法依赖注入

与Setter方法依赖注入类似,构造方法依赖注入时,首先把需要注入的类写成属性,然后使用构造方法进行依赖注入,实现代码如下:

在配置文件中进行配置,代码如下:

3.4.3 注解依赖注入

常用的注解依赖注入方式有Autowired、Required、Qualifier、Resource、Configuration和Bean等。
1. Autowired
Autowired:自动按照类型注入。类型不唯一时,会将属性名作为Bean的ID在容器中查找。
代码如下:

配置文件的代码如下:

2. Required
Required:应用于Bean属性的Setter方法。如果要使用该注解依赖注入方式,那么该注解的属性必须在配置文件中设置,否则容器会抛出一个BeanlnitializationException异常。
代码如下:

3. Qualifier和Resource
Qualifier:在按照类型注入的基础上,再按照Bean的ID注入。Qualifier在给类成员注入数据时,不能独立使用,但是在给方法的形参注入数据时可以独立使用。属性Value用于指定Bean的ID。
这个Qualifier标识表明了哪个实现类才是我们所需要的。修改、调用代码时应添加@Qualifier注解,需要注意的是@Qualifier的参数名称必须为我们之前定义@Service注解的名称之一。
代码如下:

Resource:使用属性Name指定Bean的ID,一般默认按照属性名依赖注入,如@Resource("属性名")。但如果属性名匹配不上,则使用类型依赖注入。
4. Configuration和Bean
Configuration:表示这个类可以使用Spring IoC容器作为Bean定义的来源。
Bean:返回一个对象,该对象被注册为Spring应用程序上下文中的Bean。
提示:不需要配置XML文件,直接采用注解即可。
代码如下:

使用类的反射获取对象,代码如下:
