在spring ioc中有三种依赖注入,分别是:https://blog.csdn.net/u010800201/article/details/72674420

a、接口注入;
b、setter方法注入;
c、构造方法注入;

d、注解方法注入;
接着小编对这四种注入方式一一进行讲解,通过demo的讲解,希望能够帮助小伙伴们更好的理解,不足之处还请多多指教。
接口注入

  1. public class ClassA {
  2. private InterfaceB clzB;
  3. public void doSomething() {
  4. Ojbect obj = Class.forName(Config.BImplementation).newInstance();
  5. clzB = (InterfaceB)obj;
  6. clzB.doIt();
  7. }
  8. ……
  9. }

解释一下上述的代码部分,ClassA依赖于InterfaceB的实现,我们如何获得InterfaceB的实现实例呢?传统的方法是在代码中创建 InterfaceB实现类的实例,并将赋予clzB.这样一来,ClassA在编译期即依赖于InterfaceB的实现。为了将调用者与实现者在编译期分离,于是有了上面的代码。我们根据预先在配置文件中设定的实现类的类名(Config.BImplementation),动态加载实现类,并通过InterfaceB强制转型后为ClassA所用,这就是接口注入的一个最原始的雏形。

setter方法注入

setter注入模式在实际开发中有非常广泛的应用,setter方法更加直观,我们来看一下spring的配置文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:aop="http://www.springframework.org/schema/aop"
  5. xmlns:tx="http://www.springframework.org/schema/tx"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
  7. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
  8. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">
  9. <!-- 使用spring管理对象的创建,还有对象的依赖关系 -->
  10. <bean id="userDao4Mysql" class="com.tgb.spring.dao.UserDao4MysqlImpl"/>
  11. <bean id="userDao4Oracle" class="com.tgb.spring.dao.UserDao4OracleImpl"/>
  12. <bean id="userManager" class="com.tgb.spring.manager.UserManagerImpl">
  13. <!-- (1)userManager使用了userDao,Ioc是自动创建相应的UserDao实现,都是由容器管理-->
  14. <!-- (2)在UserManager中提供构造函数,让spring将UserDao实现注入(DI)过来 -->
  15. <!-- (3)让spring管理我们对象的创建和依赖关系,必须将依赖关系配置到spring的核心配置文件中 -->
  16. <property name="userDao" ref="userDao4Oracle"></property>
  17. </bean>
  18. </beans>

接着我们来看一下,setter表示依赖关系的写法

  1. import com.tgb.spring.dao.UserDao;
  2. public class UserManagerImpl implements UserManager{
  3. private UserDao userDao;
  4. //使用设值方式赋值
  5. public void setUserDao(UserDao userDao) {
  6. this.userDao = userDao;
  7. }
  8. @Override
  9. public void addUser(String userName, String password) {
  10. userDao.addUser(userName, password);
  11. }
  12. }

构造器注入

构造器注入,即通过构造函数完成依赖关系的设定。我们看一下spring的配置文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:aop="http://www.springframework.org/schema/aop"
  5. xmlns:tx="http://www.springframework.org/schema/tx"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
  7. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
  8. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">
  9. <!-- 使用spring管理对象的创建,还有对象的依赖关系 -->
  10. <bean id="userDao4Mysql" class="com.tgb.spring.dao.UserDao4MysqlImpl"/>
  11. <bean id="userDao4Oracle" class="com.tgb.spring.dao.UserDao4OracleImpl"/>
  12. <bean id="userManager" class="com.tgb.spring.manager.UserManagerImpl">
  13. <!-- (1)userManager使用了userDao,Ioc是自动创建相应的UserDao实现,都是由容器管理-->
  14. <!-- (2)在UserManager中提供构造函数,让spring将UserDao实现注入(DI)过来 -->
  15. <!-- (3)让spring管理我们对象的创建和依赖关系,必须将依赖关系配置到spring的核心配置文件中 -->
  16. <constructor-arg ref="userDao4Oracle"/>
  17. </bean>
  18. </beans>

我们再来看一下,构造器表示依赖关系的写法,代码如下所示:

  1. import com.tgb.spring.dao.UserDao;
  2. public class UserManagerImpl implements UserManager{
  3. private UserDao userDao4Oracle;
  4. //使用构造方式赋值
  5. public UserManagerImpl(UserDao userDao4Oracle) {
  6. this.userDao4Oracle = userDao4Oracle;
  7. }
  8. @Override
  9. public void addUser(String userName, String password) {
  10. userDao.addUser(userName, password);
  11. }
  12. }
注解注入

注解注入,即通过注解方式完成依赖关系的设定。我们看一下spring的配置文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:aop="http://www.springframework.org/schema/aop"
  5. xmlns:tx="http://www.springframework.org/schema/tx"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
  7. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
  8. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">
  9. <context:annotation-config/>//启动spring注解模式

  10. <!-- 使用spring管理对象的创建,还有对象的依赖关系 -->
  11. <bean id="userDao4Mysql" class="com.tgb.spring.dao.UserDao4MysqlImpl"/>
  12. <bean id="userDao4Oracle" class="com.tgb.spring.dao.UserDao4OracleImpl"/>
  13. <bean id="userManager" class="com.tgb.spring.manager.UserManagerImpl">
  14. <!--<property name="userDao" ref="userDao4Oracle"></property> --> //这段去掉
  15. </bean>
  16. </beans>
 
具体写法:
  1. import com.tgb.spring.dao.UserDao;
  2. import javax.annotation.Resource;  //需要导入相关jar包
  3. @Resource(name="userDao4Oracle")
  4. private UserDao userDao4Oracle;
  5. public class UserManagerImpl implements UserManager{
  6. private UserDao userDao4Oracle;
  7. @Override
  8. public void addUser(String userName, String password) {
  9. userDao.addUser(userName, password);
  10. }
  11. }
 

接口注入 && setter注入 && 构造器注入
        接口注入:
接口注入模式因为具备侵入性,它要求组件必须与特定的接口相关联,因此并不被看好,实际使用有限。
Setter 注入:
对于习惯了传统 javabean 开发的程序员,通过 setter 方法设定依赖关系更加直观。如果依赖关系较为复杂,那么构造子注入模式的构造函数也会相当庞大,而此时设值注入模式则更为简洁。如果用到了第三方类库,可能要求我们的组件提供一个默认的构造函数,此时构造子注入模式也不适用。
构造器注入:
在构造期间完成一个完整的、合法的对象。所有依赖关系在构造函数中集中呈现。依赖关系在构造时由容器一次性设定,组件被创建之后一直处于相对“不变”的稳定状态。只有组件的创建者关心其内部依赖关系,对调用者而言,该依赖关系处于“黑盒”之中。

注解注入:@Resource先会按照名称到spring容器中查找,如果查找不到,就回退按照类型匹配,如果再没有匹配到,就会抛出异常。如果在开发的时候,建议大家都是用@Resource(name=”userDao”),此时只能够按照名称匹配

小编寄语:该博文,小编主要介绍了控制反转、依赖注入以及在spring中IOC的三种注入方式,配上demo进行讲解,不足之处,还请各位小伙伴多多指教,其实小编觉得,无论是控制反转还是依赖注入对编程带来最大的影响不是从代码上,而是思想上转变,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC/DI容器来创建并注入她所需要的资源了。这一举动,有效的分离了对象和她所需要的外部资源,使得它们松散耦合,有利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

spring IOC中四种依赖注入方式的更多相关文章

  1. 转:深入浅出spring IOC中四种依赖注入方式

    转:https://blog.csdn.net/u010800201/article/details/72674420 深入浅出spring IOC中四种依赖注入方式 PS:前三种是我转载的,第四种是 ...

  2. 深入浅出spring IOC中三种依赖注入方式

    深入浅出spring IOC中三种依赖注入方式 spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和 ...

  3. 【SSH系列】深入浅出spring IOC中三种依赖注入方式

    spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和依赖查找,依赖什么?为什么需要依赖?注入什么?控 ...

  4. spring IOC中三种依赖注入方式

    Spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则,用来消减计算机程序之间的耦合问题,控制反转一般分为两种类型,依赖注入和依赖查找,依赖什么?为什么需要依赖?注入 ...

  5. spring四种依赖注入方式(转)

    spring四种依赖注入方式!! 平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提 ...

  6. spring四种依赖注入方式

    一.Set注入 这是最简单的注入方式,假设有一个SpringAction,类中需要实例化一个SpringDao对象,那么就可以定义一个private的SpringDao成员变量,然后创建SpringD ...

  7. spring 四种依赖注入方式以及注解注入方式

    平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程 ...

  8. SpringDI四种依赖注入方式详解

    文章已托管到GitHub,大家可以去GitHub查看阅读,欢迎老板们前来Star!搜索关注微信公众号 [码出Offer] 领取各种学习资料! LOGO SpringDI(依赖注入) 一.DI概述 De ...

  9. [心得笔记]spring常用的三种依赖注入方式

    一.目前使用最广泛的 @Autowired:自动装配 基于@Autowired的自动装配,默认是根据类型注入,可以用于构造器.接口.方法注入,使用方式如下: @Autowired 构造方法.方法.接口 ...

随机推荐

  1. 第76课 最小生成树(Prim)

    图解: 添加prim函数: #ifndef GRAPH_H #define GRAPH_H #include "Object.h" #include "SharedPoi ...

  2. 【转载】 从ACM会议看中国大陆计算机科学与国外的差距

    ps:   这是一篇06年的文章,与今日的国内计算机行业学术圈环境简直是天翻地覆,很不错的history,值得mark下,今日的cs学术发展十号是坏不发表意见,但是history是值得对比,借鉴,思考 ...

  3. Keepalived 进程无法关闭

    操作系统:SLES12sp2 keepalived版本:1.2.12 问题描述: 使用命令"systemctl stop keepalived" 无法关闭keepalived,使用 ...

  4. lesson1-fastai

    fast-ai系统资料https://www.jianshu.com/p/2fe22a6b0ecb 中文视频 https://www.bilibili.com/video/av10156946/ind ...

  5. 线程---同步(synchronized)

    实现线程同步的一种方式介绍: 思路: 首先,需要被协调的类,先实现线程,并重写run方法 然后,在被协调的类中私有化控制器,控制器实例化,由构造器带入. 其次,由控制器对象具体负责调用. 举例:循环输 ...

  6. Maven命令安装jar包到本地仓库

    https://blog.csdn.net/moxiong3212/article/details/78767480 当需要的jar包在中央仓库找不到或者是想把自己生成的jar包放到的Maven仓库中 ...

  7. 逍遥大佬分享mysql知识

    设计表规则: 0),数据库名字以db_开始,编码UTF8 1),表名都以tb_开始 2),字段都是用小写,比如是否删除is_delete 3),表都是innodb,utf8格式的 4),最重要的,表名 ...

  8. 【java多线程】java8的流操作api和fork/join框架

    原文:https://blog.csdn.net/u011001723/article/details/52794455/ 一.测试一个案例,说明java8的流操作是并行操作 1.代码 package ...

  9. MySQL DataType--字符串函数

    1.UPPER和UCASE返回字符串str,根据当前字符集映射(缺省是ISO-8859-1 Latin1)把所有的字符改变成大写.该函数对多字节是可靠的. 2.LOWER和LCASE返回字符串str, ...

  10. 03关于C的数组指针

    一.数组与指针有什么关系 (1)地址 数组名就是一个地址,指向一个数组的开端. 从实验结果我们可以看出前三个地址都是一样的,都是数组的开始地址,而最后一个是数组的第二个元素,因为是整型数据,地址加4. ...