spring IOC中四种依赖注入方式
a、接口注入;
b、setter方法注入;
c、构造方法注入;
d、注解方法注入;
接着小编对这四种注入方式一一进行讲解,通过demo的讲解,希望能够帮助小伙伴们更好的理解,不足之处还请多多指教。
接口注入
- public class ClassA {
- private InterfaceB clzB;
- public void doSomething() {
- Ojbect obj = Class.forName(Config.BImplementation).newInstance();
- clzB = (InterfaceB)obj;
- clzB.doIt();
- }
- ……
- }
解释一下上述的代码部分,ClassA依赖于InterfaceB的实现,我们如何获得InterfaceB的实现实例呢?传统的方法是在代码中创建 InterfaceB实现类的实例,并将赋予clzB.这样一来,ClassA在编译期即依赖于InterfaceB的实现。为了将调用者与实现者在编译期分离,于是有了上面的代码。我们根据预先在配置文件中设定的实现类的类名(Config.BImplementation),动态加载实现类,并通过InterfaceB强制转型后为ClassA所用,这就是接口注入的一个最原始的雏形。
setter方法注入
setter注入模式在实际开发中有非常广泛的应用,setter方法更加直观,我们来看一下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>
接着我们来看一下,setter表示依赖关系的写法
- 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的配置文件:
- <?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 userDao4Oracle;
- //使用构造方式赋值
- public UserManagerImpl(UserDao userDao4Oracle) {
- this.userDao4Oracle = userDao4Oracle;
- }
- @Override
- public void addUser(String userName, String password) {
- userDao.addUser(userName, password);
- }
- }
注解注入,即通过注解方式完成依赖关系的设定。我们看一下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">
<context:annotation-config/>//启动spring注解模式
- <!-- 使用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">
- <!--<property name="userDao" ref="userDao4Oracle"></property> --> //这段去掉
- </bean>
- </beans>
- import com.tgb.spring.dao.UserDao;
- import javax.annotation.Resource; //需要导入相关jar包
- @Resource(name="userDao4Oracle")
- private UserDao userDao4Oracle;
- public class UserManagerImpl implements UserManager{
- private UserDao userDao4Oracle;
- @Override
- public void addUser(String userName, String password) {
- userDao.addUser(userName, password);
- }
- }
接口注入 && setter注入 && 构造器注入
接口注入:
接口注入模式因为具备侵入性,它要求组件必须与特定的接口相关联,因此并不被看好,实际使用有限。
Setter 注入:
对于习惯了传统 javabean 开发的程序员,通过 setter 方法设定依赖关系更加直观。如果依赖关系较为复杂,那么构造子注入模式的构造函数也会相当庞大,而此时设值注入模式则更为简洁。如果用到了第三方类库,可能要求我们的组件提供一个默认的构造函数,此时构造子注入模式也不适用。
构造器注入:
在构造期间完成一个完整的、合法的对象。所有依赖关系在构造函数中集中呈现。依赖关系在构造时由容器一次性设定,组件被创建之后一直处于相对“不变”的稳定状态。只有组件的创建者关心其内部依赖关系,对调用者而言,该依赖关系处于“黑盒”之中。
小编寄语:该博文,小编主要介绍了控制反转、依赖注入以及在spring中IOC的三种注入方式,配上demo进行讲解,不足之处,还请各位小伙伴多多指教,其实小编觉得,无论是控制反转还是依赖注入对编程带来最大的影响不是从代码上,而是思想上转变,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC/DI容器来创建并注入她所需要的资源了。这一举动,有效的分离了对象和她所需要的外部资源,使得它们松散耦合,有利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。
spring IOC中四种依赖注入方式的更多相关文章
- 转:深入浅出spring IOC中四种依赖注入方式
转:https://blog.csdn.net/u010800201/article/details/72674420 深入浅出spring IOC中四种依赖注入方式 PS:前三种是我转载的,第四种是 ...
- 深入浅出spring IOC中三种依赖注入方式
深入浅出spring IOC中三种依赖注入方式 spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和 ...
- 【SSH系列】深入浅出spring IOC中三种依赖注入方式
spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和依赖查找,依赖什么?为什么需要依赖?注入什么?控 ...
- spring IOC中三种依赖注入方式
Spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则,用来消减计算机程序之间的耦合问题,控制反转一般分为两种类型,依赖注入和依赖查找,依赖什么?为什么需要依赖?注入 ...
- spring四种依赖注入方式(转)
spring四种依赖注入方式!! 平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提 ...
- spring四种依赖注入方式
一.Set注入 这是最简单的注入方式,假设有一个SpringAction,类中需要实例化一个SpringDao对象,那么就可以定义一个private的SpringDao成员变量,然后创建SpringD ...
- spring 四种依赖注入方式以及注解注入方式
平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程 ...
- SpringDI四种依赖注入方式详解
文章已托管到GitHub,大家可以去GitHub查看阅读,欢迎老板们前来Star!搜索关注微信公众号 [码出Offer] 领取各种学习资料! LOGO SpringDI(依赖注入) 一.DI概述 De ...
- [心得笔记]spring常用的三种依赖注入方式
一.目前使用最广泛的 @Autowired:自动装配 基于@Autowired的自动装配,默认是根据类型注入,可以用于构造器.接口.方法注入,使用方式如下: @Autowired 构造方法.方法.接口 ...
随机推荐
- 一些Go操作Kafka的问题
1)包的选择 confluent-kafka-go使用了rdkafka的c库,破坏了go代码的收敛,不使用: sarama不支持groud id 的功能,写consumer需要自己管理消费的parti ...
- 【c++基础】字符数组和string相互转换
字符数组转化成string类型char ch [] = "ABCDEFG";string str(ch);//也可string str = ch;或者char ch [] = &q ...
- deque中的细节问题,以及reverse和max_element的使用
deque中使用迭代器进行运算的函数都默认以.end()为结束,而实际上.end()所返回的是最后一个元素的下一个位置,所以进行数据比较时,应对其-1才是对应的最后一个数据,而函数中则是直接使用.en ...
- webapi core2.1 IdentityServer4.EntityFramework Core进行配置和操作数据
https://identityserver4.readthedocs.io/en/release/quickstarts/8_entity_framework.html 此连接的实践 vscode ...
- <--------------------------构造方法------------------------------>
1 构造方法 初始化阶段 给对象的属性进行赋值 构造方法 什么是构造方法 : 字面 方法构建时 就使用的方法 对象创建的时候就使用的方法 作用:对象的属性值初始化2 如何用构造方法 修饰符 构造方法名 ...
- MySQL--使用innodb_force_recovery修复数据库异常
当MySQL服务异常重启失败后,可以通过配置参数innodb_force_recovery来对MySQL服务进行修复启动. 参数innodb_force_recovery选项: 1 (SRV_FORC ...
- Scala中的Map使用例子
Map结构是一种非常常见的结构,在各种程序语言都有对应的api,由于Spark的底层语言是Scala,所以有必要来了解下Scala中的Map使用方法. (1)不可变Map特点: api不太丰富 如果是 ...
- pstStream->pstPack[i].pu8Addr详解
/****************************************************************************** * funciton : save H2 ...
- Revit API 操作共享参数和项目参数
1.获取共享参数 private string GetSharInfo(Autodesk.Revit.ApplicationServices.Application revitApp) { Strin ...
- [转]JBoss7中domain、standalone模式介绍
JBoss AS7 可实现为云做好准备的架构,并可使启动时间缩短十倍,提供更快的部署速度并降低内在的占用.JBoss Enterprise Application Platform 6 的核心是JBo ...