依赖注入(Dependency Injection,DI)和控制反转含义相同,它们是从两个角度描述的同一个概念。

当某个 Java 实例需要另一个 Java 实例时,传统的方法是由调用者创建被调用者的实例(例如,使用 new 关键字获得被调用者实例),而使用 Spring 框架后,被调用者的实例不再由调用者创建,而是由 Spring 容器创建,这称为控制反转。

Spring 容器在创建被调用者的实例时,会自动将调用者需要的对象实例注入给调用者,这样,调用者通过 Spring 容器获得被调用者实例,这称为依赖注入。

依赖注入主要有两种实现方式,分别是属性 setter 注入和构造方法注入。具体介绍如下。

1 属性 setter 注入
指 IoC 容器使用 setter 方法注入被依赖的实例。通过调用无参构造器或无参 static 工厂方法实例化 bean 后,调用该 bean 的 setter 方法,即可实现基于 setter 的 DI。

2 构造方法注入
指 IoC 容器使用构造方法注入被依赖的实例。基于构造器的 DI 通过调用带参数的构造方法实现,每个参数代表一个依赖。

下面通过属性 setter 注入的案例演示 Spring 容器是如何实现依赖注入的。步骤如下。
1. 创建 PersonService 接口
在 spring 项目的 com.zsh包下创建一个名为 PersonService 的接口,该接口中包含一个 addPerson() 方法,如下所示。

package com.zsh;public interface PersonService {public void addPerson();
}
  1. 创建接口实现类 PersonServiceImpl
    在 com.zsh 包下创建一个名为 PersonServiceImpl 的类,该类实现了 PersonService 接口,如下所示。
package com.zsh;public class PersonServiceImpl implements PersonService {// 定义接口声明private PersonDao personDao;// 提供set()方法,用于依赖注入public void setPersonDao(PersonDao personDao) {this.personDao = personDao;}// 实现PersonService接口的方法@Overridepublic void addPerson() {personDao.add(); // 调用PersonDao中的add()方法System.out.println("addPerson()执行了...");}}

上述代码中,首先声明了 personDao 对象,并为其添加 setter 方法,用于依赖注入,然后实现了 PersonDao 接口的 addPerson() 方法,并在方法中调用 save() 方法和输出一条语句。

3. 在 applicationContext.xml 中添加配置信息
在 applicationContext.xml 配置文件中添加一个 元素,用于实例化 PersonServiceImpl 类,并将 personDao 的实例注入到 personService 中,代码如下:

<bean id="personService" class="com.zsh.PersonServiceImpl"><!-- 将personDao实例注入personService实例中 --><property name="personDao" ref="personDao"/>
</bean>

4. 编写测试方法
在 FirstTest 类中创建一个名为 test() 的方法,编辑后如下所示:

@Test
public void test() {// 定义Spring配置文件的路径String xmlPath = "applicationContext.xml";// 初始化Spring容器,加载配置文件ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);// 通过容器获取personService实例PersonService personService = (PersonService) applicationContext.getBean("personService");// 调用personService的addPerson()方法personService.addPerson();
}

5. 运行项目并查看结果
使用 JUnit 测试运行 test() 方法,运行成功后,控制台的输出结果如下图所示。

从输出结果中可以看出,使用 Spring 容器获取 userService 的实例后,调用了该实例的 addPerson() 方法,在该方法中又调用了 PersonDao 实现类中的 add() 方法,并输出了结果。这就是 Spring 容器属性 setter 注入的方式。

Spring 依赖注入的实现相关推荐

  1. arg是什么函数_java后端开发三年!你还不了解Spring 依赖注入,凭什么给你涨薪...

    前言 前两天和一个同学吃饭的时候同学跟我说了一件事,说他公司有个做了两年的人向他提出要涨薪资,他就顺口问了一个问题关于spring依赖注入的,那个要求涨薪的同学居然被问懵了...事后回家想了想这一块确 ...

  2. Java程序员进阶——Spring依赖注入原理分析

    Spring依赖注入原理分析 下面谈谈Spring是如何实现反转模式IOC或依赖注入模式DI: 平时,我们需要生成一个对象,使用new语法,如一个类为A public class A{public v ...

  3. spring 依赖注入

    Technorati 标记: spring,依赖注入,DI,ioc 平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的 ...

  4. java接口注入对象的意义_Java Web系列:Spring依赖注入基础

    一.Spring简介 1.Spring简化Java开发 Spring Framework是一个应用框架,框架一般是半成品,我们在框架的基础上可以不用每个项目自己实现架构.基础设施和常用功能性组件,而是 ...

  5. spring依赖注入原理(转载)

    关于spring依赖注入原理的文章在网络上已经有很多,我要写的这篇文章原文出自http://taeky.iteye.com/blog/563450,只所以再一次写下来只是为了一为自己收藏,方便以后的复 ...

  6. Spring依赖注入:注解注入总结

    更多11 spring 依赖注入 注解 java 注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.Service.C ...

  7. spring依赖注入_Spring源码阅读:Spring依赖注入容器

    依赖注入 依赖注入是Spring框架最核心的能力,Spring框架提供的AOP,WebMVC等其它功能都是以依赖注入容器作为基础构建的,Spring依赖注入容器类似于一个用于组装对象的框架内核,任何应 ...

  8. diy实现spring依赖注入

    [README] 本文diy代码实现了 spring 依赖注入,一定程度上揭示了依赖注入原理: [1]控制反转-Inversion of Control 是一种编码思想,简而言之就是 应用程序A可以使 ...

  9. spring依赖注入_Spring依赖注入

    spring依赖注入 介绍: 在设计良好的Java应用程序中,这些类应尽可能独立. 这样的设计提高了组件的可重用性. 它还使对各个组件进行单元测试变得更加容易. 依赖注入的概念促进了Java对象之间的 ...

  10. spring依赖注入_Spring的依赖注入陷阱

    spring依赖注入 Spring框架中有三种注入变量: 基于二传手的注射 基于构造函数的注入 基于现场的注入 这些机制中的每一种都有优点和缺点,并且不仅只有一种正确的方法. 例如现场注入: @Aut ...

最新文章

  1. 使用Java反射更改私有静态最终字段
  2. 一加3 CM13 12306 不能用
  3. Python(6):工程组织结构
  4. 开源Easydarwin流媒体服务器Windows编译、配置、部署
  5. redis——Redis中的LRU算法改进
  6. python语言的注释语句引导符_Python 为什么用 # 号作注释符?
  7. ubuntu16.04 64bit 安装 ida
  8. 怎么在html插入谷歌地图,html页面插入百度or谷歌地图
  9. Unity NGUI 组件简介
  10. VC Webbrowser操作全解(二)
  11. 2018-2-13-win10-uwp-如何让WebView标识win10手机
  12. 华为研发岗位两轮面试的准备(本科生,已经拿到offer,月薪20k,15薪)
  13. 张益唐朗道-西格尔零点猜想报告:“部分地解决黎曼假设应该是对的”
  14. 或是独体字吗_独体字
  15. ssh 所选的用户密钥未在远程主机上注册
  16. 在计算机内 信息的表现形式是什么,信息的表现形式_现代信息的形式表现为哪四种形态...
  17. 地铁发展黄金期 安防应用受考验
  18. 【数据处理】格式化数据
  19. unity3D 初学者的个人总结
  20. 分享2019年陆陆续续读过的书-附书单

热门文章

  1. php 正则mac地址,正则表达式匹配MAC地址、邮箱地址、IP地址
  2. github上成员贡献量_真祖传代码!你的GitHub代码已打包运往北极,传给1000年后人类...
  3. ubuntu mysql master slave_Ubuntu下MySQL5.5 配置主从(Master Slave)同步
  4. Spring中@Autowired和@Resource的区别
  5. 详解 Java NIO
  6. 关于request.getRequestDispatcher()的两个方法
  7. android资源透明背景,@谷歌android帝 这是你想要的,全局透明背景教程,两种方法...
  8. JVM 内存模型与内存分配方式
  9. mysql合并多条纪录字段_mysql合并多条记录的单个字段去一条记录
  10. sgm3157功能_SGM3157_SGM3157供应商_价格_Datasheet_pdf资料-IC资料网