spring依赖注入

来源:互联网 发布:淘宝客推广宝贝 编辑:程序博客网 时间:2024/06/06 09:47
一、依赖注入(DI)简介 
    依赖注入背后的基本原理是对象之间的依赖关系,可以通过以下几种方式来实现:构造器的参数、工厂方法的参数,或给由构造函数或者工厂方法创建的对象设置属性。因此,容器的工作就是创建bean时注入那些依赖关系。相对于由bean自己来控制其实例化、直接在构造器中指定依赖关系或者类似服务定位器模式这3种自主控制依赖关系注入的方法来说,控制从根本上发生了倒转,这也正是控制反转名字的由来。 

依赖注入主要有两种注入方式,即构造器注入和Setter注入。 

二、构造器注入 
基于构造器的依赖注入是通过调用带参数的构造器来实现,每个参数代表着一个依赖。下面展示了用构造器参数来注入依赖关系的例子。 

先创建一个对象(bean) 
Java代码  收藏代码
  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代码  收藏代码
  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代码  收藏代码
  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.     }  


三、Setter注入 
通过调用无参构造器或无参static工厂方法实例化bean之后,调用该bean的setter方法,即可实现基于setter的依赖注入。 

创建一个对象 

Java代码  收藏代码
  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代码  收藏代码
  1. <bean id="helloBean" class="com.spring.demo.HelloWorld">  
  2.        <property name="msg" value="Hello World!"/>  
  3.  </bean>    


测试类,获得注入的bean 

Java代码  收藏代码
  1. public static void main(String[] args){  
  2.     //读取配置文件,实例化IOC容器  
  3.     ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");  
  4.     BeanFactory factory = context;  
  5.       
  6.     HelloWorld hello = (HelloWorld)factory.getBean("helloBean");  
  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也将被创建和分配。


所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中。当spring容器启动后,spring容器初始化,创建并管理bean对象,以及销毁它。所以我们只需从容器直接获取Bean对象就行,而不用编写一句代码来创建bean对象。这种现象就称作控制反转,即应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转。虽然平时只需要按要求将bean配置到配置文件中,但是了解其实现过程对理解spring的实现原理是有好处的,下面就是模拟spring实现依赖注入的过程

0 0
原创粉丝点击