`

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

阅读更多

转载自(个人在CSDN上的文章):http://blog.csdn.net/a906998248/article/details/7514085

 

 

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

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


二、什么是依赖注入。

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

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


三、依赖注入的好处。

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

四、依赖注入的 Spring 实现

1、设值注入

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

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

 

public class HelloWorld {  
    private String msg;  
  
    public String getMsg() {   
        return msg;  
    }  
    public void setMsg(String msg) {  
        this.msg = msg;  
    }  
} 
 

 

再配置文件applicationContext.xml,实例化bean 

 

<bean id="helloBean" class="com.spring.demo.HelloWorld">  
       <property name="msg" value="Hello World!"/>  
 </bean> 
 

 

最后测试是否能够得到注入的bean,并打印出对象的属性。 

 

public static void main(String[] args){  
        //读取配置文件,获得BeanFactory  
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");  
        BeanFactory factory = context;  
          
        HelloWorld hello = (HelloWorld)factory.getBean("hello");  
          
        System.out.println(hello.getMsg());   
} 
   

2、构造注入

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

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

 

public class HelloWorld {  
    private String msg;  
  
    //需要一个默认无参构造器  
    public HelloWorld(){}  
      
    public HelloWorld(String msg){  
        this.msg = msg;  
    }  
      
    public String getMsg() {  
        return msg;  
    }  
    public void setMsg(String msg) {  
        this.msg = msg;  
    }  
} 
 

 

再配置文件applicationContext.xml,实例化bean 

 

<bean id="hello" class="com.spring.demo.HelloWorld">    
     <constructor-arg index="0">   
           <value>HelloWorld!</value>   
       </constructor-arg>    
 </bean> 
 

最后测试是否能够得到注入的bean,并打印出对象的属性。

public static void main(String[] args){  
        //读取配置文件,获得BeanFactory  
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");  
        BeanFactory factory = context;  
          
        HelloWorld hello = (HelloWorld)factory.getBean("hello");  
          
        System.out.println(hello.getMsg());   
 } 
 

五、处理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)、依赖关系只能在构造器中设定,则只有组件的创建者才能改变组件的依赖关系。对组件的调用者而言,组件内部的依赖关系完成透明,更符合高内聚的原则。

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


参考资料:

《轻量级 Java EE 企业应用实战(第三版)》 李刚

http://ganshisheng.iteye.com/blog/438608

分享到:
评论

相关推荐

    Spring 核心机制(依赖注入)

    ### Spring核心机制——依赖注入详解 #### 一、引言 Spring框架作为一款优秀的轻量级Java应用开发框架,其核心理念之一就是依赖注入(Dependency Injection, DI)。依赖注入不仅能够帮助开发者降低代码间的耦合度...

    spring 控制反转和依赖注入.docx

    Spring 框架的核心是控制反转(IOC)和依赖注入(DI),它可以将对象的创建和依赖关系管理,实现高内聚、低耦合的开发模式。 下面是 Spring 框架的核心知识点: 1. 控制反转(IOC):控制反转是 Spring 框架的...

    Spring 控制反转 依赖注入

    **Spring 框架中的控制反转 (IoC) 和...总之,Spring的控制反转和依赖注入机制是其核心特性,它们提高了代码的可测试性、降低了耦合度,并使应用程序更加灵活。理解并熟练运用这些概念,对提升开发效率和质量至关重要。

    springIOC控制反转 依赖注入实例

    Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它改变了传统Java应用程序中对象的创建和管理方式。在传统的程序设计中,我们通常手动创建对象并管理它们之间的依赖关系,而在Spring中,这些...

    Spring技术内幕:深入解析Spring架构与设计原理(第2版) .pdf

    - **依赖注入**:依赖注入是Spring框架的核心功能之一,通过构造函数注入、setter方法注入或字段注入等方式,实现了组件之间的解耦。 - **面向切面编程**:Spring支持在运行时动态地添加行为到程序中,如日志记录、...

    自定义spring控制反转(依赖注入)

    在Spring框架中,控制反转(IoC,Inversion of Control)和依赖注入(DI,Dependency Injection)是核心设计理念,它们极大地简化了Java应用的开发和维护。本文将深入探讨如何自定义Spring实现读取`...

    Spring_01_入门篇_依赖注入(控制反转)_ANN

    Spring的核心特性之一是依赖注入(Dependency Injection,简称DI),也称为控制反转(Inversion of Control,简称IoC)。 **依赖注入 (DI) 和 控制反转 (IoC)** 依赖注入是Spring的核心设计原则之一。它是一种设计...

    Spring Ioc 注解 依赖注入

    Spring框架的核心特性包括IoC(Inversion of Control,控制反转)、AOP(Aspect Oriented Programming,面向切面编程)以及提供了丰富的扩展支持。其中,IoC和依赖注入(Dependency Injection, DI)是Spring框架最核心...

    详解Spring的核心机制依赖注入

    详解Spring的核心机制依赖注入 对于一般的Java项目,他们都或多或少有一种依赖型的关系,也就是由一些互相协作的对象构成的。Spring把这种互相协作的关系称为依赖关系。如A组件调用B组件的方法,可称A组件依赖于B...

    Spring基础实例(依赖注入和控制反转)

    在IT行业中,Spring框架是Java开发...总的来说,Spring的依赖注入和控制反转机制让代码更加灵活、可维护,降低了耦合度。通过理解和实践"SpringDemo",开发者可以更好地掌握Spring的核心特性,并将其应用于实际项目中。

    Spring_01_入门篇_依赖注入(控制反转)_XML

    它的核心特性是依赖注入(Dependency Injection,简称DI),也被称为控制反转(Inversion of Control,简称IOC)。这个特性使得开发者可以更专注于业务逻辑,而不需要过多地关注对象的创建和管理。 **依赖注入(DI...

    自己实现的Spring反转控制和依赖注入

    Spring框架是Java开发中广泛应用的一个开源框架,以其优秀的反转控制(Inversion of Control,IoC)和依赖注入(Dependency Injection,DI)理念为核心,极大地简化了企业级应用的开发工作。下面将详细介绍这两个...

    java中spring依赖注入的简单例子

    javaEE 开发中 现在最成熟的框架之一应该就是spring了 spring框架最强大的地方就是实现了依赖注入 也叫控制反转 最近的一个项目中用的就是 spring框架 spring框架是工厂模式的应用结合了MVC的设计思想 大家可以...

    理解Spring中的依赖注入和控制反转

    在Spring框架中,依赖注入(Dependency Injection,简称DI)和控制反转(Inversion of Control,简称IoC)是核心设计理念,它们旨在降低组件之间的耦合度,提高代码的可测试性和可维护性。理解这两个概念对于掌握...

    控制反转_百度百科1

    * Spring框架:Spring框架的核心就是控制反转,使用依赖注入来管理对象之间的依赖关系。 * 依赖注入:依赖注入是控制反转的一种实现方式,使用依赖注入可以将对象之间的依赖关系解耦。 * 面向对象编程:控制反转是...

    19丨理论五:控制反转、依赖反转、依赖注入,这三者有何区别和联系?1

    依赖反转、控制反转和依赖注入是面向对象编程中重要的设计原则和实践,它们在软件设计中扮演着关键角色,尤其在Spring框架中被广泛应用。现在,让我们深入理解这三个概念的区别和联系。 首先,依赖反转(Dependency...

    依赖注入控制反转面向切面.doc

    依赖注入(Dependency Injection,简称DI)和控制反转(Inversion of Control,简称IoC)是软件设计中的核心概念,尤其在面向对象编程中扮演着重要角色。这两种技术的主要目标是降低代码之间的耦合度,提高模块间的...

    spring依赖注入的实现原理

    Spring依赖注入(Dependency Injection,简称DI)是Java应用开发中常用的设计模式,它极大地提高了代码的可测试性和可维护性。在Spring框架中,依赖注入是核心特性之一,通过控制反转(Inversion of Control,IoC)...

Global site tag (gtag.js) - Google Analytics