
2.3 依赖注入的类型
在Spring中实现IoC容器的方法是依赖注入,依赖注入的作用是在使用Spring框架创建对象时动态地将其所依赖的对象(例如属性值)注入Bean组件中。Spring框架的依赖注入通常有两种实现方式,一种是使用构造方法注入,另一种是使用属性的setter方法注入。
2.3.1 使用构造方法注入
Spring框架可以采用Java的反射机制,通过构造方法完成依赖注入。下面通过Web应用ch2讲解构造方法注入的实现过程,ch2应用的目录结构如图2.1所示。

图2.1 ch2的目录结构
① 创建dao包
在ch2应用中创建dao包,并在该包中创建TestDIDao接口和接口实现类TestDIDaoImpl。创建dao包的目的是在service中使用构造方法依赖注入TestDIDao接口对象。
TestDIDao接口的代码如下:

TestDIDaoImpl实现类的代码如下:

② 创建service包
在ch2应用中创建service包,并在该包中创建TestDIService接口和接口实现类TestDIServiceImpl。在TestDIServiceImpl中使用构造方法依赖注入TestDIDao接口对象。
TestDIService接口的代码如下:

TestDIServiceImpl实现类的代码如下:

③ 编写配置文件
在src根目录下创建Spring配置文件applicationContext.xml。在配置文件中首先将dao.TestDIDaoImpl类托管给Spring,让Spring创建其对象,然后将service.TestDIServiceImpl类托管给Spring,让Spring创建其对象,同时给构造方法传递实参。配置文件的具体代码如下:

在配置文件中,constructor-arg元素用于定义类构造方法的参数,index用于定义参数的位置,ref指定某个实例的引用,如果参数是常量值,ref由value代替。
④ 创建test包
在ch2应用中创建test包,并在该包中创建测试类TestDI,具体代码如下:

2.3.2 使用属性的setter方法注入
使用setter方法注入是Spring框架中最主流的注入方式,它利用Java Bean规范所定义的setter方法来完成注入,灵活且可读性高。对于setter方法注入,Spring框架也是使用Java的反射机制实现的。下面接着2.3.1节的ch2应用讲解使用属性的setter方法注入的实现过程。
① 创建接口实现类TestDIServiceImpl1
在service包中创建接口实现类TestDIServiceImpl1,在TestDIServiceImpl1中使用属性的setter方法依赖注入TestDIDao接口对象,具体代码如下:

② 将TestDIServiceImpl1类托管给Spring
将TestDIServiceImpl1类托管给Spring,让Spring创建其对象,同时调用TestDIServiceImpl1类的setter方法完成依赖注入。在配置文件中添加如下代码:

③ 在test中测试setter方法注入
在主类中添加如下代码测试setter方法注入:
