zoukankan      html  css  js  c++  java
  • Spring IOC 依赖注入的两种方式XML和注解

    依赖注入的原理 
    依赖注入的方式---XML配置 
    依赖注入的方式---注解的方式

    spring 它的核心就是IOC和AOP。而IOC中实现Bean注入的实现方式之一就是DI(依赖注入)。 

    一 DI的原理 
    DI的基本原理:对象之间的依赖关系只会通过三种方式:构造函数参数,工厂方法的参数以及构造函数或工厂方法创建的对象属性设置。因此,容器的工作哦就是在创建Bean时注入所有的依赖关系。相对于由Bean自己控制其实例化,直接在构造器中指定依赖关系或者类似服务定位器(Service Locator)这三种自主控制依赖关系注入的方法,而控制权从根本上发生改变,即控制反转(Inverse of Controll)---IOC. 
    应用DI规则后,我们不用在关注对象之间的依赖关系,从而达到高层次的松耦合。DI有两种实现方式---Setter/getter方式(传值方式)和构造器方式(引用方式)。 
    下面就从XML配置和注解角度来介绍这两种方式。

     二、DI的方式---XML配置 
    1. Setter/getter方法 
    下面是一个Sample

    1)、beans.xml (外部注入的方式)

    [html] view plain copy
     
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.        xmlns:context="http://www.springframework.org/schema/context"         
    5.        xsi:schemaLocation="http://www.springframework.org/schema/beans  
    6.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
    7.            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">                 
    8.    <bean id="personDao" class="com.spring.dao.impl.PersonDaoImpl"></bean>    
    9.            <bean id="personService" class="com.spring.service.impl.PersonServiceBean" >    
    10.        <property name="personDao" ref="personDao"/>    
    11.    </bean>   
    12. </beans>  

    2) PersonDao.Java

    [html] view plain copy
     
    1. package com.spring.dao;   
    2. ublic interface PersonDao {  
    3. public void add();     


     

    3) PersonDaoImpl.java

    [html] view plain copy
     
    1.  package com.spring.dao.impl;   
    2. import com.spring.dao.PersonDao;  
    3.   
    4. public class PersonDaoImpl implements PersonDao {  
    5.  public void add() {  
    6.    System.out.println("PersonDao.add() is running.");     
    7.  }  
    8. }  
    9.    


    4) PersonService.java

    [html] view plain copy
     
    1. package com.spring.service;   
    2. public interface PersonService {  
    3.  public  void save();     
    4. }  


    5) PersonServiceBean.java

    [html] view plain copy
     
    1. package com.spring.service.impl;   
    2. import com.spring.dao.*;  
    3. import com.spring.service.PersonService;  
    4. import javax.annotation.PostConstruct;  
    5. import javax.annotation.PreDestroy;  
    6.   
    7. public class PersonServiceBean implements PersonService {  
    8.       private PersonDao personDao;     
    9.            
    10.   public PersonServiceBean(){     
    11.           System.out.println("personServiceBean.constructor() is running.");     
    12.       }     
    13.     
    14.       public PersonDao getPersonDao() {     
    15.           return personDao;     
    16.       }     
    17.        
    18.      public void setPersonDao(PersonDao personDao) {     
    19.          this.personDao = personDao;     
    20.       }     
    21.       public void save(){     
    22.           System.out.println("Name:" );     
    23.           personDao.add();     
    24.       }     
    25.       @PostConstruct    
    26.       public void init(){     
    27.          System.out.println("PersonServiceBean.init() is running.");     
    28.       }     
    29.           
    30.       @PreDestroy    
    31.       public void destory(){     
    32.           System.out.println("PersonServiceBean.destory() is running.");     
    33.       }     
    34. }  


    6) SpringIOCTest.java(测试类)

    [html] view plain copy
     
    1. package junit.test;   
    2. import org.junit.BeforeClass;  
    3. import org.junit.Test;  
    4. import org.springframework.context.support.AbstractApplicationContext;  
    5. import org.springframework.context.support.ClassPathXmlApplicationContext;  
    6.   
    7. import com.spring.service.PersonService;  
    8.   
    9. public class SpringIOCTest {  
    10.   
    11.  @BeforeClass  
    12.  public static void setUpBeforeClass() throws Exception {  
    13.  }  
    14.      @Test public void instanceSpring(){     
    15.            AbstractApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");     
    16.            PersonService personService = (PersonService)context.getBean("personService");     
    17.            personService.save();     
    18. //          context.close();     
    19.    }     
    20. }  


    我们还可以采用内部注入的方式来处理: 
    Beans.xml修改如下:

    [html] view plain copy
     
    1. <bean id="personService">    
    2.                 <property name="personDao">    
    3.                      <bean/>    
    4.                  </property>    
    5.  </bean>  


     2、构造器注入

    以下是个例子

    [html] view plain copy
     
    1. <bean id="personDao" class="com.spring.dao.impl.PersonDaoImpl"></bean>   
    2.     <bean id="personService"  class="com.spring.service.impl.PersonServiceBean" init-method="init" destroy-method="destory">    
    3.                 <constructor-arg index="0" type="com.spring.dao.PersonDao" ref="personDao"/>    
    4.     <constructor-arg index="1" value="Jamson" />     
    5. </bean>  


     2) PersonService.java:同Setter方法注入 
    3) PersonServiceBean.java

    [html] view plain copy
     
    1. public class PersonServiceBean implements PersonService {  
    2.       private PersonDao personDao;     
    3.       private String name;  
    4.            
    5.   public PersonServiceBean(){     
    6.           System.out.println("personServiceBean.constructor() is running.");     
    7.       }     
    8.     
    9.    
    10.       public PersonServiceBean(PersonDao personDao, String name) {     
    11.        this.personDao = personDao;     
    12.         this.name = name;     
    13.      }     
    14.       
    15. //      public PersonDao getPersonDao() {     
    16. //          return personDao;     
    17. //      }         
    18. //     public void setPersonDao(PersonDao personDao) {     
    19. //         this.personDao = personDao;     
    20. //      }     
    21.       public void save(){     
    22.           System.out.println("Name:"+name );     
    23.           personDao.add();     
    24.       }     
    25.       @PostConstruct    
    26.       public void init(){     
    27.          System.out.println("PersonServiceBean.init() is running.");     
    28.       }     
    29.           
    30.       @PreDestroy    
    31.       public void destory(){     
    32.           System.out.println("PersonServiceBean.destory() is running.");     
    33.       }     
    34. }  


     4) PersonDao.java:同Setter方法注入 
    5) PersonDaoImpl.java:同Setter方法注入 
    6) 测试类(SpringIOCTest.java):同上

    控制台信息

    [html] view plain copy
     
    1. PersonServiceBean.init() is running.  
    2. Name:Jamson  
    3. PersonDao.add() is running.  
    4. PersonServiceBean.destory() is running.  


     


    三 DI的方式---注解的配置 
    自从Jdk5中引入Annotation类后,在EJB和Spring中得到广泛的使用,也越来越被开发者们在平时的应用中使用。主要是用在Field上的注入。在日常的应用开发中,一个项目中有很多的bean,如果使用XML文件配置,就会导致配置文件难以管理。使用注解注入的时候,能够使bean的配置文件内容不至于繁杂。 
    首先介绍下注解的两种方式:@Resource(javax.annotation.Resource)和@Autowired. 
    @Resource:首先按照名称去寻找当前的bean,如果找不到的话,那就以类型装配。 
    @Autowired:首先按照类型去寻找当前的bean, 如果找不到的话,那就以名称装配。 
    1. Resource 
    下面介绍一个Sample:

    1)beans.xml

    [html] view plain copy
     
    1. <context:annotation-config/>  
    2. <bean id="personDao" class="com.spring.dao.impl.PersonDaoImpl"></bean>   
    3.  <bean id="personService"  class="com.spring.service.impl.PersonServiceBean"  init-method="init" destroy-method="destory">     
    4. </bean>  


     2) PersonService.java:同上。 
    3) PersonServiceBean.java

    [html] view plain copy
     
    1. package com.spring.service.impl;   
    2. import com.spring.dao.*;  
    3. import com.spring.service.PersonService;  
    4. import javax.annotation.PostConstruct;  
    5. import javax.annotation.PreDestroy;  
    6. import javax.annotation.Resource;  
    7.   
    8. public class PersonServiceBean implements PersonService {  
    9.   @Resource(name="personDao")  
    10.       private PersonDao personDao;     
    11.       private String name;  
    12.            
    13.   public PersonServiceBean(){     
    14.           System.out.println("personServiceBean.constructor() is running.");     
    15.       }     
    16.     
    17.    
    18.       public PersonServiceBean(PersonDao personDao, String name) {     
    19.        this.personDao = personDao;     
    20.         this.name = name;     
    21.      }     
    22.       
    23. //      public PersonDao getPersonDao() {     
    24. //          return personDao;     
    25. //      }         
    26. //     public void setPersonDao(PersonDao personDao) {     
    27. //         this.personDao = personDao;     
    28. //      }     
    29.       public void save(){     
    30.           System.out.println("Name:"+name );     
    31.           personDao.add();     
    32.       }     
    33.       @PostConstruct    
    34.       public void init(){     
    35.          System.out.println("PersonServiceBean.init() is running.");     
    36.       }     
    37.           
    38.       @PreDestroy    
    39.       public void destory(){     
    40.           System.out.println("PersonServiceBean.destory() is running.");     
    41.       }     
    42. }  


    4) PersonDao.java:同上 
    5) PersonDaoService.java:同上 
    6) 测试类SpringIOCTest.java:同上

    ==================================================

    http://blog.china.alibaba.com/blog/amarsoft/article/b0-i22919434.html

  • 相关阅读:
    当el-input输入多行内容,反显时,字符串需要换行显示
    【前端】记录自己在leetcode上的刷题之路
    本地提代码到github上,不显示贡献值的问题
    关于对象的深拷贝和浅拷贝
    js判断两个数值区间是否存在重叠或覆盖
    解决vue-print-nb打印el-table,不同分辨率下,打印显示不全的问题
    vue实现置顶功能
    el-table设置自定义表头,当表头内容过长时,鼠标悬浮显示完整内容
    省市用element级联选择器,构造树形结构的数据(两层)
    STL隐蔽知识点
  • 原文地址:https://www.cnblogs.com/hanfeihanfei/p/6706556.html
Copyright © 2011-2022 走看看