zoukankan      html  css  js  c++  java
  • Spring学习 Ioc篇(三)

    1、在注解注入方式中,首先要在xml中引入如下的红线的命名空间:

    Xml代码
    1. <?xml version="1.0" encoding="UTF-8" ?>   
    2. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">   
    3.   <context:annotation-config />   
    4. </<beans>  
    同时要引入apache开源组织的common-annotation.jar (JSR-250中的注解)。
    2、在注解中应用到的注解:
    @AutoWired和@Resource
    (1)@AutoWired和@Resource的区别
    @AutoWired默认按类型进行装配。
    @Resource默认情况下按名称进行装配,当按名称搜素不到的情况下,再按类型进行装配。但是如果指定了name属性则就只按名称进行装配(@Resource(name="personDao"))
    3、按注解进行装配的例子
    Java代码 
    1. <?xml version="1.0" encoding="UTF-8" ?>   
    2. - <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">  
    3.   <context:annotation-config />   
    4.   <bean id="personDao" class="com.cvicse.dao.impl.PersonDaoBean" />   
    5. <bean id="personService" class="com.cvicse.service.impl.PersonServiceBean"/>  
    6.   </beans>  
     在程序中的应用
    Java代码 
    1. public class PersonServiceBean implements PersonService {  
    2.     @Resource private PersonDao personDao;  
    3.     private String name;      
    4.       
    5.     public void setPersonDao(PersonDao personDao) {  
    6.         this.personDao = personDao;  
    7.     }  
    8.   
    9.     public PersonServiceBean(){}  
    10.       
    11.     public PersonServiceBean(PersonDao personDao, String name) {  
    12.         this.personDao = personDao;  
    13.         this.name = name;  
    14.     }  
    15.   
    16.     public void save(){  
    17.         personDao.add();  
    18.     }  
    19. }  
     在程序中标注了@Resource后,spring容器会默认根据名字进行在xml中搜素id为personDao的bean,如果搜索不到则按PersonDao 的接口去搜索相应的实现类型com.cvicse.dao.impl.PersonDaoBean。
    @Autowired注解和前面的@resource用法是一样的。如果要将@Autowired的注解按名称来进行搜素,则需要如下的设置:
    @Autowired@Qualifier("personDao")
    另外,@Autowired有一个required的属性:
    @Autowired(required=false) @Qualifier("personDao"):表示当在配置文件中搜索不到时就把该属性注入为null。
    @Autowired(required=true) @Qualifier("personDao"):表示当在配置文件中搜索不到时抛异常。
    4、自动装配
          即在配置文件中设置相应的装配类型由spring容器去进行装配。在spring的开发中不建议使用自动装配,因为自动装配会发生预想不到的未知的错误。
    Autowired属性取值如下: 
     byType: 按照类型自动装配,可以根据属性的类型,在容器中寻找跟类型匹配的bean。如果发现多个,那么会抛出异常。如果没有找到,即属性值为null. 
     byName: 按照名称装配,可以根据属性的名称,在容器中寻找跟该属性名相同的bean,如果没有找到,即属性值为null。 
     constructor : 与byType的方式类似,不同之处在于它应用于构造器参数。如果在人那个其中没有找 
    到,即属性值为null。 
     autodetect :通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。(如果发现默认的构造器,那么将使用byType方式) 
    Java代码 
    1. public class PersonServiceBean implements PersonService {  
    2.     private PersonDao personDao;  
    3.     private String name;  
    4.     public PersonServiceBean() {  
    5.     }  
    6.     public void save()  
    7.     {  
    8.         personDao.save();  
    9.     }  
    10. }  
     配置文件的配置如下:
    Java代码 
    1. <bean id="personDao" class="com.cvicse.dao.PersonDao"/>   
    2. <bean id="personServiceBean"   
    3. class="com.cvicse.service.impl.PersonServiceBean" autowire="byType"/>  
    5、自动扫描方式注入组件
          前面我们都是使用XML的bean定义来配置组件。在一个稍大的项目中,通常会有上百个组件,如果这些组件采用xml的bean定义来配置,显然会增加配置文件的体积,查找及维护起来也不太方便。Spring2.5为我们引入了组件自动扫描机制,它可以在类路径下寻找标注了@Component、@Service、@Controller、@Repository注解的类,并把这些类纳入到spring的容其中管理。它的作用和在xml文件中使用bean节点配置组件是一样的。要使用自动扫描机制,我们需要打开一下配置信息:
    Xml代码 
    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"    xmlns:context="http://www.springframework.org/schema/context"    xsi:schemaLocation="http://www.springframework.org/schema/beans           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
    4.       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">   
    5.    <context:component-scan base-package="com.cvicse"/>   
    6. </bean>   
      
    其中,base-package就是要扫描的包以及子包 

    @Service用于标注业务层组件 
    @Controller用于标注控制层组件(如struts中的action) 
    @Repository用于标注数据访问层组件,即DAO 
    @Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
    Java代码 
    1. import org.springframework.stereotype.Repository;  
    2. @Repository  
    3. public class PersonDao {  
    4.     public void save() {  
    5.         System.out.println("save");       
    6.     }  
    7. }  

    这样,当容器扫描到此类的时候就纳入了容器里。 
     
    Java代码 
    1. import org.springframework.stereotype.Service;  
    2. import com.cvicse.dao.PersonDao;  
    3. import com.cvicse.service.PersonService;  
    4. @Service  
    5. public class PersonServiceBean implements PersonService {  
    6.     @Resource private PersonDao personDao;  
    7.     public void setPersonDao(PersonDao personDao) {  
    8.         this.personDao = personDao;  
    9.     }  
    10.     public void save()  
    11.     {  
    12.         personDao.save();  
    13.     }  
    14. }  

    这样我们如何调用此bean?也没有配置文件里的id.spring规范这样规定:在自动扫描的情况下,要得到一个容器管理的bean,可以提供bean的全名,但是第一个字符小写!
    Java代码  收藏代码
    1. ApplicationContext ctx = new   
    2. ClassPathXmlApplicationContext("beans.xml");  
    3. PersonService personService =   
    4. (PersonService)ctx.getBean("personServiceBean ");  
    5. personService.save();  
    当然,可以自己指定被调用的时候用的名称(默认都是单例模式,即scope=singleton)
    Java代码 
    1. @Service(“personService”)  
    2. public class PersonServiceBean implements PersonService  

    如果要改成原型模式怎么做呢?这样
    Java代码 
    1. @Service(“personService”) @Scope(“prototype”)  
    2. public class PersonServiceBean implements PersonService  
    3.    
    但是这样如何实现指定初始化和销毁方法呢?spring采用的是注解方式!
    Java代码 
    1. import javax.annotation.PostConstruct;  
    2. import javax.annotation.PreDestroy;  
    3.  @PostConstruct  
    4.  public void init(){  
    5.   System.out.println("初始化");  
    6.  }  
    7.  @PreDestroy  
    8.  public void destroy(){  
    9.   System.out.println("销毁");  
    10.  }  






  • 相关阅读:
    分享一下我珍藏的各种资料。
    JEditorPane中html文档中文乱码解决
    ubuntu恢复rm -rf误删文件
    MBR与分区表备份与恢复
    ubuntu tab命令补全失效
    selinux理解1-selinux介绍
    Mac-Xcode统计整个项目代码行数
    Mac清理空间-Xcode-删除相关文件
    # iOS开发
    Charles问题总结-最新版4.5.6
  • 原文地址:https://www.cnblogs.com/jeffen/p/6155487.html
Copyright © 2011-2022 走看看