对spring控制反转以及依赖注入的理解
一、说到依赖注入(控制反转),先要理解什么是依赖。
Spring 把相互协作的关系称为依赖关系。假如 A组件调用了 B组件的方法,我们可称A组件依赖于
B组件。
二、什么是依赖注入。
在传统的程序设计过程中,通常由调用者来创建被调用者的实例。
在依赖注入的模式下。创建被调用者的工作不再由调用者来完毕,因此称为控制反转。创建被调用者实例的工作通常由Spring容器来完毕。然后注入给调用者。因此也称为依赖注入。
自己理解:即一句话,由spring容器来控制组件A的调用的详细对象B。组件A依赖于spring容器的注入。
三、依赖注入的优点。
无论是依赖注入。还是控制反转,都说明Spring採用动态、灵活的方式来管理各种对象。
对象与对象之间的详细实现互相透明。在理解依赖注入之前,看例如以下这个问题在各种社会形态里怎样解决:一个人(Java实例。调用者)须要一把斧子(Java实例。被调用者)。
(1)原始社会里。差点儿没有社会分工。
须要斧子的人(调用者)仅仅能自己去磨一把斧子(被调用者)。相应的情形为:Java程序里的调用者自己创建被调用者。
(2)进入工业社会,工厂出现。斧子不再由普通人完毕。而在工厂里被生产出来,此时须要斧子的人(调用者)找到工厂,购买斧子,无须关心斧子的制造过程。相应Java程序的简单工厂的设计模式。
(此方法依赖于接口)
(3)进入“按需分配”社会,须要斧子的人不须要找到工厂,坐在家里发出一个简单指令:须要斧子。斧子就自然出如今他面前。相应Spring的依赖注入。
第一种情况下,Java实例的调用者创建被调用的Java实例。必定要求被调用的Java类出如今调用者的代码里。无法实现二者之间的松耦合。
另外一种情况下,调用者无须关心被调用者详细实现过程,仅仅须要找到符合某种标准(接口)的实例。就可以使用。
此时调用的代码面向接口编程,能够让调用者和被调用者解耦,这也是工厂模式大量使用的原因。但调用者须要自己定位工厂,调用者与特定工厂耦合在一起。
情况下,调用者无须自己定位工厂。程序执行到须要被调用者时,系统自己主动提供被调用者实例。其实,调用者和被调用者都处于Spring的管理下。二者之间的依赖关系由Spring提供。
延时载入:容器在
依赖注入让 Spring的 Bean以被指文件组织在一起。而不是以硬编码的方式耦合在一起。程序完毕无须理会被调用者的实现,也不无须主动定位工厂,这是最好的解耦方式。
实例之间的依赖关系由
IoC 容器负责管理。
spring实现的主要原理:通过读取beanx.xml配置文件(有专门的工具类 elements),利用java的反射机制,生成相应的类对象(Object类型,然后能够用Object.getDeclaredMethods()来获取全部的方法名称。假设该方法名以set为开头,那么我们能够再读取配置文件里相应的属性,利用method.invoke()方法将属性注入到我们的对象其中。
模拟实现方式能够參考一下博客
http://blog.csdn.net/it_man/article/details/4402245
四、依赖注入的 Spring实现
、设值注入
设值注入是指 IoC容器使用属性的 setting方法来注入被依赖的实例。
先创建一个实体对象(Bean)
[java] view
plaincopy
1. public class HelloWorld {
2. private String msg;
3.
4. public String getMsg() {
5. return msg;
6. }
7. public void setMsg(String msg) {
8. this.msg = msg;
9. }
10. }
再配置文件applicationContext.xml。实例化bean
[java] view
plaincopy
1. <bean id="helloBean" class="com.spring.demo.HelloWorld">
2. <property name="msg" value="Hello World!"/>
3. </bean>
最后測试是否可以得到注入的bean,并打印出对象的属性。
[java] view
plaincopy
1. public static void main(String[] args){
2. //读取配置文件。获得BeanFactory
3. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
4. BeanFactory factory = context;
5.
6. HelloWorld hello = (HelloWorld)factory.getBean("hello");
7.
8. System.out.println(hello.getMsg());
9. }
、构造注入
除了设值注入。还有还有一种注入方式,这样的方式在构造实例时,已为其完毕了依赖关系的初始化。
这样的利用构造器来设置依赖关系的方式,被称为构造注入。
先创建一个实体对象(Bean)
[java] view
plaincopy
1. public class HelloWorld {
2. private String msg;
3.
4. //须要一个默认无參构造器
5. public HelloWorld(){}
6.
7. public HelloWorld(String msg){
8. this.msg = msg;
9. }
10.
11. public String getMsg() {
12. return msg;
13. }
14. public void setMsg(String msg) {
15. this.msg = msg;
16. }
17. }
再配置文件applicationContext.xml,实例化bean。
[java] view
plaincopy
1. <bean id="hello" class="com.spring.demo.HelloWorld">
2. <constructor-arg index="0">
3. <value>HelloWorld!</value>
4. </constructor-arg>
5. </bean>
最后測试是否可以得到注入的bean,并打印出对象的属性。
[java] view
plaincopy
1. public static void main(String[] args){
2. //读取配置文件,获得BeanFactory
3. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
4. BeanFactory factory = context;
5.  
对spring控制反转以及依赖注入的理解的更多相关文章
- spring 控制反转与依赖注入原理-学习笔记
在Spring中有两个非常重要的概念,控制反转和依赖注入:控制反转将依赖对象的创建和管理交由Spring容器,而依赖注入则是在控制反转的基础上将Spring容器管理的依赖对象注入到应用之中: 所谓依赖 ...
- Spring控制反转与依赖注入(IOC、DI)
IOC: 反转控制 Inverse Of Control DI:依赖注入 Dependency Injection 目的:完成程序的解耦合 解释:在应用系统的开发过程中,有spring负责对象的创 ...
- Spring控制反转(依赖注入)的最简单说明
1.常规方式实现实例化 1.1已有角色如下: 一个接口Interface,两个接口实现类InstatnceA.InstanceB,一个调用类User 1.2当前实例化InstanceA如下: Inte ...
- Spring 控制反转和依赖注入
控制反转的类型 控制反转(IOC)旨在提供一种更简单的机制,来设置组件的依赖项,并在整个生命周期管理这些依赖项.通常,控制反转可以分成两种子类型:依赖注入(DI)和依赖查找(DL),这些子类型各自又可 ...
- java 控制反转和依赖注入的理解
开始好好学习java基础和思想~ 控制反转(IOC)是Spring框架的核心思想,用我自己的话说,就是你要做一件事,别自己可劲new了,你就说你要干啥,然后外包出去就好~ 依赖注入(DI) 在我浅薄的 ...
- Spring理论基础-控制反转和依赖注入
第一次了解到控制反转(Inversion of Control)这个概念,是在学习Spring框架的时候.IOC和AOP作为Spring的两大特征,自然是要去好好学学的.而依赖注入(Dependenc ...
- 轻松了解Spring中的控制反转和依赖注入(二)
紧接上一篇文章<轻松了解Spring中的控制反转和依赖注入>讲解了SpringIOC和DI的基本概念,这篇文章我们模拟一下SpringIOC的工作机制,使我们更加深刻的理解其中的工作. 类 ...
- 轻松了解Spring中的控制反转和依赖注入(一)
我们回顾一下计算机的发展史,从最初第一台计算机的占地面积达170平方米,重达30吨,到现如今的个人笔记本,事物更加轻量功能却更加丰富,这是事物发展过程中的一个趋势,在技术领域中同样也是如此,企业级Ja ...
- spring学习总结一----控制反转与依赖注入
spring作为java EE中使用最为广泛的框架,它的设计体现了很多设计模式中经典的原则和思想,所以,该框架的各种实现方法非常值得我们去研究,下面先对spring中最为重要的思想之一----控制反转 ...
随机推荐
- 《深入理解java虚拟机》学习笔记四/垃圾收集器GC学习/一
Grabage Collection GC GC要完毕的三件事情: 哪些内存须要回收? 什么时候回收? 怎样回收? 内存运行时区域的各个部分中: 程序计数器.虚拟机栈.本地方法栈这3个区域随 ...
- libssh2进行远程运行LINUX命令
/** * CSSHClient.h * @file 说明信息.. * DATE February 13 2015 * * @author Ming_zhang */ #ifndef _CSSHCLI ...
- 「微信小程序」有哪些冲击与机会?
昨天晚上相信大家的朋友圈被「微信小程序」刷屏了,这影响力赶上了国务院出台新政策一样,足以说明微信在中国的影响力之大. 然后今天公号后台一大堆人问我怎么看这件事,不少人非常忧虑,仿佛自己将要失业一样. ...
- android notify
notify http://examples.javacodegeeks.com/android/core/ui/notifications/android-notifications-example ...
- numpy_basic3
矩陣 矩阵是numpy.matrix类类型的对象,该类继承自numpy.ndarray,任何针对多维数组的操作,对矩阵同样有效,但是作为子类矩阵又结合其自身的特点,做了必要的扩充,比如:乘法计算.求逆 ...
- Redis学习总结和相关资料
因为别人都在用Redis,所以我不得不用Redis. 听起来感觉我很菜的样子,事实上和菜没有关系. 一是由于别人都用,作为后来者,没有"先发"优势,只能顺着别人的思路来做.当前 ...
- setting.system-全局属性的设定
SystemProperties跟Settings.System 1 使用 SystemProperties.get如果属性名称以“ro.”开头,那么这个属性被视为只读属性.一旦设置,属性值不能改变. ...
- home-界面返回上一级功能
1,这个主要是用在actionbar上home键,直接上代码 import android.view.MenuItem; /* Vanzo:zhangshuli on: Mon, 23 Mar 201 ...
- setInterval()第一个参数带引号和不带引号的区别
setInterval()第一个参数带引号和不带引号的区别:关于定时函数setInterval()的基本用法这里就不做介绍了,查阅相关教程即可,这里主要介绍一下setInterval()函数的第一个参 ...
- C# List 复制克隆副本
[C#技术] C# List 复制克隆副本数字人 发表于:2012-8-28 18:02:49废话不多说,看代码: 方法一: List<string> t = new List<st ...