在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. 10.2.0.5环境dg测试logminer挖掘日志分析

    起因:客户需求,数据库正常每天总的日志切换是20以内,有一天日志切换总数,达到30,客户建议使用Logminer进行日志挖掘分析,到底什么应用导致的问题. 说明:使用logminer进行日志挖掘,只能 ...

  2. 【err】VIDEOIO ERROR: V4L: index 0 is not correct!Unable to connect to camera

    前言 新到手一块板子,程序编译成功之后,运行出现错误,不能连接到摄像头. 问题 VIDEOIO ERROR: V4L: index is not correct! Unable to connect ...

  3. Django中的应用

    1.什么是应用 应用就是网站中的一个独立的程序模块,在Django中,主目录一般不处理具体的请求,主目录一般要处理的是项目的初始化操作以及请求的分发(分布式请求处理).而具体的请求是由各个应用去处理. ...

  4. PYTHON 定时器简单封装,基于SCHED

    python fresher,轻拍. 在写后台服务时经常会遇到很多定时器的场景,threading.Timer类每实例化一个定时器会有一个新线程去执行,在客户端使用倒是没有问题,如果是服务器端定时器数 ...

  5. HTML5的一些知识点

    1.新增很多api,比如获取用户的地理位置的window.navigator.geoloaction,history,audio,video,canvas 2.websocket;websocket是 ...

  6. PTA——四舍五入

    PTA 7-18 出租车计价 (15 分) #include<stdio.h> int main() { double s,w; int t; scanf("%lf %d&quo ...

  7. test-ipv6

    http://test-ipv6.com/ ! 你的公网 IPv4 地址是 89.42.31.211! 你的公网 IPv6 地址是 2001:ac8:21:8::376e:989b! 你已接入 IPv ...

  8. wekpack笔记

    1. webpack 是一个用来构建我们应用程序中的 JavaScript 模块的工具: 2. 可以从CLI 或 API来开始使用 webpack.这里只讲从CLI来使用它: 3. 安装,需要在nod ...

  9. Go Example--切片

    package main import ( "fmt" ) func main() { //make来初始化一个切片,必须指名切片的长度 s:= make([]string, 3) ...

  10. Go Example--Hello

    Hello world package main import "fmt" //通过import导入fmt标准包 func main() { //语句结尾不需要;分号, //Pri ...