对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中最为重要的思想之一----控制反转 ...
随机推荐
- 洛谷 P1217 [USACO1.5]回文质数 Prime Palindromes
P1217 [USACO1.5]回文质数 Prime Palindromes 题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找 ...
- 建堆是 O(n) 的时间复杂度证明。
建堆的复杂度先考虑满二叉树,和计算完全二叉树的建堆复杂度一样. 对满二叉树而言,第 \(i\) 层(根为第 \(0\) 层)有 \(2^i\) 个节点. 由于建堆过程自底向上,以交换作为主要操作,因此 ...
- 简约之美jodd--props属性使用
Prop是一个超级properties:包含了很多jdk缺失的东西:utf-8支持,宏,分区,profiles,全配置等等. 属性存储在一个或者多个*.props文件,而且它是开放的,支持多种类型的资 ...
- Day4晚笔记
数据结构 并查集:捆绑两个点的信息,判断对错 倍增:LCA, 字符串 hash,模拟, 最小表示法 给定一个环状字符串,切开,使得字符串的字典序最小 图和树 割点,割边,强联通分量 点双联通分量 (把 ...
- ASP.NET MVC使用Ninject
Ninject是一个快如闪电的,轻量级的.....依赖注入框架,呃呃呃,貌似很少用到,Ninject就是一个DI容器,作用是对ASP.NET MVC程序中的组件进行解耦 ,说到解耦其实也有其他的方式可 ...
- C# winform利用反射和自定义特性加载功能模块(插件式开发)
由于在实际的工作中, 碰见这样的一个问题: 一个软件, 销售给A客户 他需要所有功能, 但是销售给B客户, 他只需要其中的一部分, 1.如果我们在实际的开发过程中, 没有把一些功能模块区分开来的话, ...
- shell脚本中的反引号,单引号,双引号与反斜杠
转自:http://blog.sina.com.cn/s/blog_6561ca8c0102we2i.html 反引号位 (`)经常被忽略,而且容易与单引号弄混.它位于键盘的Tab键的上方.1键的左方 ...
- 例说linux内核与应用数据通信(一):加入一个系统调用
[版权声明:尊重原创.转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 应用不能訪问内核的内存空间.为了应用和内核交互信息,内核提供一 ...
- android开发-获取wifi列表
近期博主在学frangment框架,因此想着想着就想通过listfragment完毕对wifi列表的获取. 好! 如今就不说废话了. 一.wifi的基础知识 在Android的官方文档中定义了例如以下 ...
- 利用朴素贝叶斯(Navie Bayes)进行垃圾邮件分类
贝叶斯公式描写叙述的是一组条件概率之间相互转化的关系. 在机器学习中.贝叶斯公式能够应用在分类问题上. 这篇文章是基于自己的学习所整理.并利用一个垃圾邮件分类的样例来加深对于理论的理解. 这里我们来解 ...