构造器注入
构造器注入,即经过构造函数完成依赖关系的设定。咱们看一下spring的配置文件:html
[html] view plain copyjava
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
- http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
- http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">
-
- <!-- 使用spring管理对象的建立,还有对象的依赖关系 -->
- <bean id="userDao4Mysql" class="com.tgb.spring.dao.UserDao4MysqlImpl"/>
-
- <bean id="userDao4Oracle" class="com.tgb.spring.dao.UserDao4OracleImpl"/>
-
- <bean id="userManager" class="com.tgb.spring.manager.UserManagerImpl">
- <!-- (1)userManager使用了userDao,Ioc是自动建立相应的UserDao实现,都是由容器管理-->
- <!-- (2)在UserManager中提供构造函数,让spring将UserDao实现注入(DI)过来 -->
- <!-- (3)让spring管理咱们对象的建立和依赖关系,必须将依赖关系配置到spring的核心配置文件中 -->
-
- <constructor-arg ref="userDao4Oracle"/>
- </bean>
-
- </beans>
咱们再看一下,构造器表示依赖关系的写法:程序员
[java] view plain copyspring
- import com.tgb.spring.dao.UserDao;
-
- public class UserManagerImpl implements UserManager{
-
- private UserDao userDao;
-
- //使用构造方式赋值
- public UserManagerImpl(UserDao userDao) {
- this.userDao = userDao;
- }
-
- @Override
- public void addUser(String userName, String password) {
-
- userDao.addUser(userName, password);
- }
- }
设值注入(Setter)
设值注入模式在实际开发中获得了最普遍的应用,在LZ看来,基于设值模式的依赖注入机制更加直观、也更加的天然。咱们看一下spring的配置文件:sql
[html] view plain copyide
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
- http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
- http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">
-
- <!-- 使用spring管理对象的建立,还有对象的依赖关系 -->
- <bean id="userDao4Mysql" class="com.tgb.spring.dao.UserDao4MysqlImpl"/>
-
- <bean id="userDao4Oracle" class="com.tgb.spring.dao.UserDao4OracleImpl"/>
-
- <bean id="userManager" class="com.tgb.spring.manager.UserManagerImpl">
- <!-- (1)userManager使用了userDao,Ioc是自动建立相应的UserDao实现,都是由容器管理-->
- <!-- (2)在UserManager中提供构造函数,让spring将UserDao实现注入(DI)过来 -->
- <!-- (3)让spring管理咱们对象的建立和依赖关系,必须将依赖关系配置到spring的核心配置文件中 -->
-
- <property name="userDao" ref="userDao4Oracle"></property>
- </bean>
-
- </beans>
咱们再看一下,设值表示依赖关系的写法:函数
[java] view plain copythis
- import com.tgb.spring.dao.UserDao;
-
- public class UserManagerImpl implements UserManager{
-
- private UserDao userDao;
-
- //使用设值方式赋值
- public void setUserDao(UserDao userDao) {
- this.userDao = userDao;
- }
-
- @Override
- public void addUser(String userName, String password) {
-
- userDao.addUser(userName, password);
- }
- }
从上面的代码,咱们能够发现,无论是构造器方式仍是设值方式,只有两处写法不太同样,一是配置spring的配置文件,二是在依赖关系的写法不一样,但都能根据名称区别开,下面咱们再对比它们各自的优点。spa
对比
相同点:.net
构造器和设值的依赖注入实现模式均具有无侵入性的特色。而且这两种实现方式各有特色,也各有优点(一句经典废话
)。
不一样点:
构造方法与设值方法最重要的不一样点只是建立对象的时机不一样。
构造方法是当实例化对象时执行的即“在构造期即建立一个完整、合法的对象”,例如咱们的Dao对象就想在实例化UserManager的时候传值,那么咱们必需要用构造方法。若是咱们没有这样的需求的话,咱们彻底可使用设值方法。
构造器方式的优点:
一、在构造期即建立一个完整、合法的对象。
二、避免了繁琐的Setter方式的编写,全部的依赖关系都在构造函数中设定。
三、没有Setter方法,依赖关系在构造时由容器一次性设定,所以组件在被建立以后即处于相对“不变”的稳定状态。
设值方式的优点:
一、对于习惯了传统JavaBean开发的程序员而言,经过setter方法设定依赖关系显得更加直观,更加天然。
二、若是依赖关系(或继承关系)较为复杂,那么构造方法的构造函数也会至关庞大(咱们须要在构造函数中设定全部依赖关系),此时设值方式每每更为简洁。
总结
构造器方式和设值方式,各有千秋,而spring对这种类型的注入方式都提供了良好的支持。不过对于基于Spring开发的应用而言,设值方式使用的更加普遍。