Spring的IOC逐层深入——依赖注入的两种实现类型
构造器注入
构造器注入,即通过构造函数完成依赖关系的设定。我们看一下spring的配置文件:
- <?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>
我们再看一下,构造器表示依赖关系的写法:
- 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的配置文件:
- <?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>
我们再看一下,设值表示依赖关系的写法:
- 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的配置文件,二是在依赖关系的写法不同,但都能根据名称区别开,下面我们再对比它们各自的优势。
对比
相同点:
构造器和设值的依赖注入实现模式均具备无侵入性的特点。并且这两种实现方式各有特点,也各有优势(一句经典废话
)。
不同点:
构造方法与设值方法最重要的不同点只是创建对象的时机不同。
构造方法是当实例化对象时执行的即“在构造期即创建一个完整、合法的对象”,例如我们的Dao对象就想在实例化UserManager的时候传值,那么我们必须要用构造方法。如果我们没有这样的需求的话,我们完全可以使用设值方法。
构造器方式的优势:
1、在构造期即创建一个完整、合法的对象。
2、避免了繁琐的Setter方式的编写,所有的依赖关系都在构造函数中设定。
3、没有Setter方法,依赖关系在构造时由容器一次性设定,因此组件在被创建之后即处于相对“不变”的稳定状态。
设值方式的优势:
1、对于习惯了传统JavaBean开发的程序员而言,通过setter方法设定依赖关系显得更加直观,更加自然。
2、如果依赖关系(或继承关系)较为复杂,那么构造方法的构造函数也会相当庞大(我们需要在构造函数中设定所有依赖关系),此时设值方式往往更为简洁。
构造器方式和设值方式,各有千秋,而spring对这种类型的注入方式都提供了良好的支持。不过对于基于Spring开发的应用而言,设值方式使用的更加广泛。
Spring的IOC逐层深入——依赖注入的两种实现类型的更多相关文章
- 【SSH进阶之路】Spring的IOC逐层深入——依赖注入的两种实现类型(四)
上篇博文,我们介绍了为什么使用IOC容器,和IOC的设计思想以及IOC容器的优缺点,并且给大家转载了一篇介绍IOC原理的博文,我们这篇主要给大家依赖注入的两种方式,以及他们的优缺点. 我们这篇博文还是 ...
- spring的IOC——依赖注入的两种实现类型
一.构造器注入: 构造器注入,即通过构造函数完成依赖关系的设定.我们看一下spring的配置文件: <constructor-arg ref="userDao4Oracle" ...
- Spring IOC 依赖注入的两种方式XML和注解
依赖注入的原理 依赖注入的方式---XML配置 依赖注入的方式---注解的方式 Spring 它的核心就是IOC和AOP.而IOC中实现Bean注入的实现方式之一就是DI(依赖注入). 一 DI的原理 ...
- spring框架--IOC容器,依赖注入
思考: 1. 对象创建创建能否写死? 2. 对象创建细节 对象数量 action 多个 [维护成员变量] service 一个 [不需要维护公共变量] dao 一个 [不需要维护 ...
- spring4笔记----依赖注入的两种形式
设值注入:通过<property.../>元素驱动Spring执行setter的方法 构造注入:通过<constructor-arg.../>元素驱动Spring执行带有参数的 ...
- 【Spring源码解析】—— 依赖注入结合SpringMVC Demo-xml配置理解
在IOC容器初始化的梳理之后,对依赖注入做一个总结,就是bean实例化的过程,bean的定义有两种方式,一种是xml文件配置,一种是注解,这里是对xml配置文件的依赖注入的介绍,后续对bean与该部分 ...
- Java:控制反转(IoC)与依赖注入(DI)
很长一段时间里,我对控制反转和依赖注入这两个概念很模糊,闭上眼睛想一想,总有一种眩晕的感觉.但为了成为一名优秀的 Java 工程师,我花了一周的时间,彻底把它们搞清楚了. 01.紧耦合 在我们编码的过 ...
- 【SSH进阶之路】Spring的IOC逐层深入——源码解析之IoC的根本BeanFactory(五)
我们前面的三篇博文,简单易懂的介绍了为什么要使用IOC[实例讲解](二).和Spring的IOC原理[通俗解释](三)以及依赖注入的两种常用实现类型(四),这些都是刚开始学习Spring IoC容器时 ...
- 初识Spring框架实现IOC和DI(依赖注入)
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的, IoC是 ...
随机推荐
- The service cannot be activated because it does not support ASP.NET compatibility
刚刚在ASP.NET创建一个Service,在运行时,它即显示异常: The service cannot be activated because it does not support ASP.N ...
- 【FTP】在自己的电脑上建立FTP服务器
<1> 添加新用户: “计算机”点击右键 “管理”得到: 点击“本地用户和组”,点击“用户”: 右键 “新用户”: 设定用户名与密码,这是以后连FTP服务器时用的登录用户名与密码. < ...
- html5掷骰子的小demo
代码如下: <!DOCTYPE> <html> <title>柯乐义</title> <head> <script> var l ...
- webapi初学项目(增删改查)
初学wenapi做了一个从数据库增删改查的项目 webapi: 1.创建项目:visual C# —> ASP.NET MVC 4 web应用程序 模板—>web api; 2.注册路由: ...
- ListActivity的使用
Android中经常用到列表,ListActivity是实现列表的一种好方法. 使用ListActivity的方法,首先定义布局文件: <?xml version="1.0" ...
- 利用navigator对象在浏览器中检查插件
利用navigator对象在浏览器中检查插件,实现的代码如下. // IE4+.firefox.chrome.safari.opera中,利用navigator检测插件 ,name为插件的名字 fun ...
- 2016暑假多校联合---Joint Stacks (STL)
HDU 5818 Problem Description A stack is a data structure in which all insertions and deletions of e ...
- Guacamole之配置Guacamole(五)
摘要 在网上看到一篇Guacamole官方手册的翻译,但是找不到后续,于是想自己也翻译几篇,有时间的话,会尽量多翻译一些. 原文地址:http://guacamole.incubator.apache ...
- 15款帮助你实现响应式导航的 jQuery 插件
对于我们大多数人来说,建立一个负责任的布局中最困难的方面是规划和导航的实现.由于没有真正经得起考验的通用解决方案,您可以使用的菜单设计风格将取决于正在建设的网站类型. 无论你正在建设什么类型的网站,在 ...
- PS教程:20个新鲜出炉的 Photoshop 中级教程
Photoshop 实例教程是提高 Photoshop 技能的最佳学习途径.今天,我向大家分享最新20个 Photoshop 进阶教程,提高你的图片处理技巧,制作时尚的效果.这些教程可以帮助把你的想法 ...