Spring 的核心机制:依赖注入(控制反转)

一、说到依赖注入(控制反转),先要理解什么是依赖。

Spring 把相互协作的关系称为依赖关系。假如 A 组件调用了 B 组件的方法,我们可称A 组件依赖于 B 组件

二、什么是依赖注入。

在传统的程序设计过程中,通常由调用者来创建被调用者的实例

在依赖注入的模式下,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者实例的工作通常由Spring 容器来完成,然后注入给调用者,因此也称为依赖注入。

三、依赖注入的好处。

依赖注入让 Spring 的 Bean 以被指文件组织在一起,而不是以硬编码的方式耦合在一起程序完成无须理会被调用者的实现,也不无须主动定位工厂,这是最好的解耦方式实例之间的依赖关系由
IoC 容器负责管理

四、依赖注入的 Spring 实现

1、设值注入

设值注入是指 IoC 容器使用属性的 setting 方法来注入被依赖的实例。

先创建一个实体对象(Bean)

[java] view plaincopy

  1. public class HelloWorld {
  2. private String msg;
  3. public String getMsg() {
  4. return msg;
  5. }
  6. public void setMsg(String msg) {
  7. this.msg = msg;
  8. }
  9. }

再配置文件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. HelloWorld hello = (HelloWorld)factory.getBean("hello");
  6. System.out.println(hello.getMsg());
  7. }

2、构造注入

除了设值注入,还有另一种注入方式,这种方式在构造实例时,已为其完成了依赖关系的初始化。这种利用构造器来设置依赖关系的方式,被称为构造注入。

先创建一个实体对象(Bean)

[java] view plaincopy

  1. public class HelloWorld {
  2. private String msg;
  3. //需要一个默认无参构造器
  4. public HelloWorld(){}
  5. public HelloWorld(String msg){
  6. this.msg = msg;
  7. }
  8. public String getMsg() {
  9. return msg;
  10. }
  11. public void setMsg(String msg) {
  12. this.msg = msg;
  13. }
  14. }

再配置文件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. HelloWorld hello = (HelloWorld)factory.getBean("hello");
  6. System.out.println(hello.getMsg());
  7. }

五、处理bean依赖关系的步骤

1、根据定义bean的配置创建并初始化BeanFactory实例 
2、每个bean的依赖将以属性、构造器参数、或静态工厂方法参数的形式出现。当这些bean被实际创建时,这些依赖也将会提供给该bean。 
3、每个属性或构造器参数既可以是一个实际的值,也可以是对该容器中另一个bean的引用。 
4、每个指定的属性或构造器参数值必须能够被转换成特定的格式或构造参数所需的类型。

Spring
会在容器被创建时验证容器中每个bean的配置,包括验证那些bean所引用的属性是否指向一个有效的bean。在bean被实际创建之前,bean的属
性并不会被设置。伴随着bean被实际创建,作为该bean的依赖bean以及依赖bean的依赖bean也将被创建和分配。

六、两种注入方式的对比

1、相比之下,设值注入具有如下的优点:

(1)、与传统的 JavaBean 的写法更相似,程序开发人员更容易理解、接受。通过 Setting 方法设定依赖关系显得更加直观、自然。
(2)、对于复杂的依赖关系,如果采用构造注入,会导致构造过于臃肿,难以阅读。Spring 在创建 Bean 实例时,需要同时实例化其依赖的全部实例,因而导致性能下降。而使用设值注入,则能避免这些问题。
(3)、尤其是在某些属性可选的情况下,多参数的构造器更加笨重。

2、构造注入也不是绝对不如设值注入,在某些特定的场景下,构造注入比设值注入更优秀。构造注入也有如下优势:

(1)、构造注入可以在构造器中决定依赖关系的注入顺序,有限依赖的优先注入。例如,组件中某些其他依赖关系的注入,尝尝需要依赖于 Datasource 的注入。采用构造注入,可以在代码中清晰地决定注入顺序。
(2)、对于依赖关系无须变化的 Bean ,构造注入更有用处。因为没有 setting 方法,所有的依赖关系全部在构造器内设定。因此,无须担心后续代码对依赖关系产生的破坏。
(3)、依赖关系只能在构造器中设定,则只有组件的创建者才能改变组件的依赖关系。对组件的调用者而言,组件内部的依赖关系完成透明,更符合高内聚的原则。

两种方式总结:建议采用以设值注入为住,构造注入为辅的注入策略。对于依赖关系无须变换的注入,尽量采用构造注入;而其他的依赖关系的注入,则考虑采用设值注入

Spring 的核心机制:依赖注入(控制反转),布布扣,bubuko.com

时间: 2024-12-20 01:09:38

Spring 的核心机制:依赖注入(控制反转)的相关文章

Helloworld之Spring依赖注入/控制反转(DI/IoC)版

Helloworld之Spring依赖注入/控制反转(DI/IoC)版 作者:雨水, 日期:2014-10-29 摘要:本文主要用于培训初学者理解Spring中的依赖注入的基本概念. 先介绍依赖注入的基本概念,然后以构造器注入为例实现了Helloworld实例. Spring依赖注入/控制反转 在我们通常的编程中,如果类A要依赖类B,通常是由A来创建一个B的实例.而Spring将创建B的实例的工作交给Spring容器来完成,然后注入A,因此称为依赖注入(DI, Dependency Inject

C#依赖注入控制反转IOC实现详解

原文:C#依赖注入控制反转IOC实现详解 IOC的基本概念是:不创建对象,但是描述创建它们的方式.在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务.容器负责将这些联系在一起. 举个例子,组件A中有类ClassA,组件B中有接口IB和其对应的实现类B1和B2. 那么,现在ClassA需要利用IB接口来做一些事情,例如: public class ClassA { public void DoSomething() { IB b = ??? b.DoWork(); }} 现

PHP关于依赖注入(控制反转)的解释和例子说明

PHP关于依赖注入(控制反转)的解释和例子说明 发表于2年前(2014-03-20 10:12)   阅读(726) | 评论(1) 8人收藏此文章, 我要收藏 赞2 阿里云双11绽放在即 1111 元红包即刻开抢!»   摘要 自从听到依赖注入这个设计模式,感觉很高大上,无奈楼主的眼光一直局限在国内框架上,也很少去关注设计模式方面的文章,直到某天遇到了laravel后,发现它手册里重点强调了一个名为“依赖注入”和“容器”的概念,但是对于这两个概念,手册里并未做基本的解释,所以楼主只能另外查找相

spring-第一篇之spring核心机制依赖注入(DI)/控制翻转(IoC)

1.spring的核心机制:依赖注入(DI)/控制翻转(IoC) 什么是依赖:A对象需要调用B对象,所以A依赖于B. 什么是注入:A对象注入一个属性B对象. 什么是依赖注入(DI):A对象依赖于B对象,spring容器负责将B对象添加到A对象中,即将A对象的依赖对象B添加到A对象中. 什么是控制翻转(IoC):A对象依赖于B对象,它将通过new B对象的方式主动获取得B对象实例:但spring则将B对象直接送到A面前供其使用,A被动接受B对象. 依赖注入(DI)与控制翻转(IoC)的关系:只是从

Spring进阶之路(1)-Spring核心机制:依赖注入/控制反转

我们常常会遇到这样一种情景.就是在我们开发项目的时候常常会在一个类中调用其它的类中的方法,来完毕我们期望的任务.大部分的情况下往往会採用在当前需要的这个类里面new一个实例出来.然后调用他的方法,那么这种话会有个问题.就是有一天我想改变下这个类,改为其它的名称.那么这时候必需要做的是同一时候去调用方的类文件里改变这个改变的类的名称.这种情况是由于代码的耦合带来了后期维护成本的添加,那么spring的出现就能够非常好的起到解耦的作用,而他的核心机制就是依赖注入. 依赖注入与控制反转 依赖注入:对于

【小知识】小例子说明Spring的核心思想之一:控制反转。

装饰设计模式:使用频率很高!!! 目的:改写已存在的类的某个方法或某些方法,使方法增强了.装饰设计模式(也即包装设计模式) 口诀: 1.编写一个类,实现与被包装类相同的接口.(这样他们就具备了相同的行为) 2.定义一个被包装类类型的变量,即引用,用于接收被包装的对象. 3.定义构造方法,把被包装类的对象注入,给被包装类变量赋值.(因为后面我要用该包装类的对象,所以要注入进来) 4.对于需要改写的方法,写自己的代码.(若重写方法的时候,还需要用到其他类的对象,那我们就在构造方法中继续注入即可) 5

分层,工厂模式,依赖注入控制反转

1.分层:就如同一个人自己制造一个锤子,自己动手丰衣足食.你需要他就自己new一个该实例.无法实现二者之间的松耦合 2.工厂模式:一个人需要一个锤子,他找工厂,工厂帮他造了一个锤子.工厂给你制造的锤子,但是如何造的你不需要知道.你直接调用该接口就可以了,具体你不需要知道.调用者无须关心被调用者具体实现过程,只需要找到符合某种标准(接口)的实例,即可使用 3.依赖注入:一个人需要一个锤子,他打电话给卖锤子的叫他送货上门.你喜欢哪家的锤子,直接叫哪家送货上门就OK.用者无须自己定位工厂,程序运行到需

大话依赖倒置?控制反转?依赖注入?面向接口编程

那些年,空气中仿佛还能闻到汉唐盛世的余韵,因此你决不允许自己的脸上有油光,时刻保持活力.然而,你一定曾为这些“高深术语”感到过困扰——依赖倒置•控制反转•依赖注入•面向接口编程.也许时至今日,你仍对它们一知半解.不过就在今天,这一切都将彻底改变!我将带领你以一种全新的高清视角进入奇妙的编程世界,领略涵泳在这些“高深术语”中的活泼泼的地气,以及翩跹于青萍之末的云水禅心. ·内聚 内聚,通俗的来讲,就是自己的东西自己保管,自己的事情自己做. 经典理论告诉我们,程序的两大要素:一个是数据(data),

Spring容器核心机制

Spring容器核心机制 一.背景 Spring内部最核心的机制就是IOC,控制反转.它可以让你再使用某一个对象的时候不用再去new了,只需要告诉Spring你要调用的对象的beanid就可以.这其实就是利用java里的反射,反射其实就是在运行时动态的去创建.调用对象,Spring就是在运行时,根据配置文件或注解来动态的创建对象,和调用对象里的方法的 . Spring还有一个核心就是AOP这个就是面向切面编程,可以为某一类对象 进行监督和控制(也就是 在调用这类对象的具体方法的前后去调用你指定的