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

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


二、什么是依赖注入。


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



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


三、依赖注入的好处。


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




四、依赖注入的 Spring 实现

1、设值注入


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



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


[java]  view plain copy



    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 plain copy


    1. <bean id="helloBean" class="com.spring.demo.HelloWorld">    
    2. "msg" value="Hello World!"/>    
    3.  </bean>



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



    [java]  view plain copy

    1. public static void main(String[] args){    
    2. //读取配置文件,获得BeanFactory    
    3. new ClassPathXmlApplicationContext("applicationContext.xml");    
    4.         BeanFactory factory = context;    
    5.             
    6. "hello");    
    7.             
    8.         System.out.println(hello.getMsg());     
    9.  }



    2、构造注入


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




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



    [java]  view plain copy


    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 plain copy


    1. <bean id="hello" class="com.spring.demo.HelloWorld">      
    2. "0">     
    3.            <value>HelloWorld!</value>     
    4.        </constructor-arg>      
    5.  </bean>




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


    [java]  view plain copy

    1. public static void main(String[] args){    
    2. //读取配置文件,获得BeanFactory    
    3. new ClassPathXmlApplicationContext("applicationContext.xml");    
    4.         BeanFactory factory = context;    
    5.             
    6. "hello");    
    7.             
    8.         System.out.println(hello.getMsg());     
    9.  }


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


    1、根据定义bean的配置创建并初始化BeanFactory实例 

    2、每个bean的依赖将以属性、构造器参数、或静态工厂方法参数的形式出现。当这些bean被实际创建时,这些依赖也将会提供给该bean。 

    3、每个属性或构造器参数既可以是一个实际的值,也可以是对该容器中另一个bean的引用。 

    4、每个指定的属性或构造器参数值必须能够被转换成特定的格式或构造参数所需的类型。 


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