构造器注入也就是构造方法注入,学习之前,还是先准备下环境:
创建一个Maven项目
pom.xml添加依赖
resources下添加spring的配置文件
这些步骤和前面的都一致,大家可以快速的拷贝即可,最终项目的结构如下:
(1)项目中添加BookDao、BookDaoImpl、UserDao、UserDaoImpl、BookService和BookServiceImpl类
(2)resources下提供spring的配置文件
(3)编写AppForDIConstructor运行类,加载Spring的IOC容器,并从中获取对应的bean对象
构造器注入引用数据类型
步骤1:删除setter方法并提供构造方法
在BookServiceImpl类中将bookDao的setter方法删除掉,并添加带有bookDao参数的构造方法
步骤2:配置文件中进行配置构造方式注入
在applicationContext.xml中配置
说明:
标签<constructor-arg>中
name属性对应的值为构造函数中方法形参的参数名,必须要保持一致。
ref属性指向的是spring的IOC容器中其他bean对象。
步骤3:运行程序
运行AppForDIConstructor类,查看结果,说明bookDao已经成功注入。
构造器注入多个引用数据类型
步骤1:提供多个属性的构造函数
在BookServiceImpl声明userDao并提供多个参数的构造函数
步骤2:配置文件中配置多参数注入
在applicationContext.xml中配置注入
说明:这两个<contructor-arg>
的配置顺序可以任意
步骤3:运行程序
运行AppForDIConstructor类,查看结果,说明userDao已经成功注入。
构造器注入多个简单数据类型
步骤1:添加多个简单属性并提供构造方法
修改BookDaoImpl类,添加构造方法
步骤2:配置完成多个属性构造器注入
在applicationContext.xml中进行注入配置
说明:这两个<contructor-arg>
的配置顺序可以任意
步骤3:运行程序
运行AppForDIConstructor类,查看结果
上面已经完成了构造函数注入的基本使用,但是会存在一些问题:当构造函数中方法的参数名发生变化后,配置文件中的name属性也需要跟着变
在解决这个问题之前,需要提前说明的是,这个参数名发生变化的情况并不多,所以上面的还是比较主流的配置方式,下面介绍的,大家都以了解为主。
方式一:删除name属性,添加type属性,按照类型注入
这种方式可以解决构造函数形参名发生变化带来的耦合问题
但是如果构造方法参数中有类型相同的参数,这种方式就不太好实现了
方式二:删除type属性,添加index属性,按照索引下标注入,下标从0开始
这种方式可以解决参数类型重复问题
但是如果构造方法参数顺序发生变化后,这种方式又带来了耦合问题