??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品国产手机,亚洲伊人久久大香线焦,久久久久亚洲av无码专区喷水http://www.tkk7.com/kangdy/category/49798.html我就像AK47里打出去的子式V目标TMD永远在前斏V我只能TMD拼命向前?/description>zh-cnThu, 03 Nov 2011 03:32:51 GMTThu, 03 Nov 2011 03:32:51 GMT60(转蝲)Spring 注解@Component,@Service,@Controller,@Repositoryhttp://www.tkk7.com/kangdy/archive/2011/10/10/360402.htmlAK47AK47Mon, 10 Oct 2011 08:46:00 GMThttp://www.tkk7.com/kangdy/archive/2011/10/10/360402.htmlhttp://www.tkk7.com/kangdy/comments/360402.htmlhttp://www.tkk7.com/kangdy/archive/2011/10/10/360402.html#Feedback0http://www.tkk7.com/kangdy/comments/commentRss/360402.htmlhttp://www.tkk7.com/kangdy/services/trackbacks/360402.html

Spring 2.5 中除了提?@Component 注释外,q定义了几个拥有Ҏ语义的注释,它们分别是:@Repository、@Service ?@Controller。在目前?nbsp;Spring 版本中,q?3 个注释和 @Component 是等效的Q但是从注释cȝ命名上,很容易看 3 个注释分别和持久层、业务层和控制层QWeb 层)相对应。虽然目前这 3 个注释和 @Component 相比没有什么新意,?nbsp;Spring 在以后的版本中为它们添加特D的功能。所以,如果 Web 应用E序采用了经典的三层分层l构的话Q最好在持久层、业务层和控制层分别采用 @Repository、@Service ?@Controller 对分层中的类q行注释Q而用 @Component 寚w些比较中立的c进行注释?br />
?一个稍大的目中,通常会有上百个组Ӟ如果q些lg采用xml的bean定义来配|,昄会增加配|文件的体积Q查找以及维护v来也不太方便? Spring2.5为我们引入了lg自动扫描机制Q他可以在类路径底下L标注? @Component,@Service,@Controller,@Repository注解的类Qƈ把这些类U_qspring容器中管理。它的作?和在xml文g中用bean节点配置lg时一L。要使用自动扫描机制Q我们需要打开以下配置信息Q?nbsp;
Java代码

1. <?xml version="1.0" encoding="UTF-8" ?> <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"  
2. >  
3.   
4. <context:component-scan base-package=”com.eric.spring”>   
5. </beans>   
   /*其中base-package为需要扫描的包(含所有子包)

     @Service用于标注业务层组Ӟ

     @Controller用于标注控制层组Ӟ如struts中的actionQ?

     @Repository用于标注数据讉KlgQ即DAOlgQ?/p>

     @Component泛指lgQ当lg不好归类的时候,我们可以使用q个注解q行标注?/p>

    */   


6. @Service public class VentorServiceImpl implements iVentorService {   
7. } @Repository public class VentorDaoImpl implements iVentorDao {  
8. }

/*getBean的默认名U是cdQ头字母?写)Q如果想自定义,可以@Service(“aaaaa”)q样来指定,q种bean默认是单例的Q如果想改变Q可以?@Service(“beanName”) @Scope(“prototype”)来改变。可以用以下方式指定初始化Ҏ和销毁方法(Ҏ名Q意)Q? @PostConstruct public void init() {  

*/
9. }  
10. @PreDestroy public void destory() {  
11. } 

注入方式Q?/strong>

?DAO实现cL入到service实现cMQ把service的接?注意不要是service的实现类)注入到action中,注入时不要new q个注入的类Q因为spring会自动注入,如果手动再new的话会出现错误,然后属性加上@Autowired后不需要getter()?setter()ҎQSpring也会自动注入。至于更具体的内容,{对注入的方式更加熟l后会做个完整的例子上来?br />
注解Q?/strong>

? spring的配|文仉面只需要加?lt;context:annotation-config/> ?lt;context:component-scan base-package="需要实现注入的cL在包"/>Q可以用base-package="*"表示全部的类?nbsp;  

<context:component-scan base-package=”com.eric.spring”> 

其中base-package为需要扫描的包(含所有子包)

在接口前面标上@Autowired和@Qualifier注释使得接口可以被容器注入,当接口存在两个实现类的时候必L定其中一个来注入Q用实现类首字母小写的字符串来注入Q如Q?/p>

  1.     @Autowired     
  2.   
  3.     @Qualifier("chinese")      
  4.   
  5.     private Man man;   

否则可以省略Q只写@Autowired   ?nbsp;

@Service服务层组Ӟ用于标注业务层组?表示定义一个beanQ自动根据bean的类名实例化一个首写字母ؓ写的beanQ例如Chinese实例化ؓchineseQ如果需要自己改名字?@Service("你自己改的bean?)?nbsp;  

@Controller用于标注控制层组?如struts中的action)

@Repository持久层组Ӟ用于标注数据讉KlgQ即DAOlg

@Component泛指lgQ当lg不好归类的时候,我们可以使用q个注解q行标注?nbsp;


@Service 
public class VentorServiceImpl implements iVentorService { 
}

@Repository 
public class VentorDaoImpl implements iVentorDao { 


getBean 的默认名U是cdQ头字母写Q,如果惌定义Q可以@Service(“aaaaa”) q样来指定,q种

bean默认是单例的Q如果想改变Q可以用@Service(“beanName”) @Scope(“prototype”)来改变?br />
可以使用以下方式指定初始化方法和销毁方法(Ҏ名Q意)Q?br />
@PostConstruct

public void init() { 



@PreDestroy

public void destory() { 

}



AK47 2011-10-10 16:46 发表评论
]]>
(转脓)使用 Spring 2.5 注释驱动?IoC 功能http://www.tkk7.com/kangdy/archive/2011/10/10/360391.htmlAK47AK47Mon, 10 Oct 2011 07:49:00 GMThttp://www.tkk7.com/kangdy/archive/2011/10/10/360391.htmlhttp://www.tkk7.com/kangdy/comments/360391.htmlhttp://www.tkk7.com/kangdy/archive/2011/10/10/360391.html#Feedback0http://www.tkk7.com/kangdy/comments/commentRss/360391.htmlhttp://www.tkk7.com/kangdy/services/trackbacks/360391.html原帖地址Q?
http://www.ibm.com/developerworks/cn/java/j-lo-spring25-ioc/

概述

注释配置相对?XML 配置h很多的优势:

  • 它可以充分利?Java 的反机制获取类l构信息Q这些信息可以有效减配|的工作。如使用 JPA 注释配置 ORM 映射Ӟ我们׃需要指?PO 的属性名、类型等信息Q如果关p表字段?PO 属性名、类型都一_您甚x需~写d属性映信?#8212;—因ؓq些信息都可以通过 Java 反射机制获取?/li>
  • 注释?Java 代码位于一个文件中Q?XML 配置采用独立的配|文Ӟ大多数配|信息在E序开发完成后都不会调_如果配置信息?Java 代码攑֜一P有助于增强程序的内聚性。而采用独立的 XML 配置文gQ程序员在编写一个功能时Q往往需要在E序文g和配|文件中不停切换Q这U思维上的不连贯会降低开发效率?/li>

因此在很多情况下Q注释配|比 XML 配置更受Ƣ迎Q注释配|有q一步流行的势。Spring 2.5 的一大增强就是引入了很多注释c,现在您已l可以用注释配|完成大部分 XML 配置的功能。在q篇文章里,我们向您讲qC用注释进?Bean 定义和依赖注入的内容?/p>

 
原来我们是怎么做的      
在用注释配|之前,先来回顾一下传l上是如何配|?Bean q完?Bean 之间依赖关系的徏立。下面是 3 个类Q它们分别是 Office、Car ?BossQ这 3 个类需要在 Spring 容器中配|ؓ BeanQ?nbsp;   
   
Office 仅有一个属性:    
     
清单 1. Office.java    
                    
package com.baobaotao;    
public class Office {    
    private String officeNo =”001”;    
   
    //省略 get/setter    
   
    @Override   
    public String toString() {    
        return "officeNo:" + officeNo;    
    }    
}    
       
Car 拥有两个属性:    
     
清单 2. Car.java 
                     
package com.baobaotao;    
   
public class Car {    
    private String brand;    
    private double price;    
   
    // 省略 get/setter    
   
    @Override   
    public String toString() {    
        return "brand:" + brand + "," + "price:" + price;    
    }    
}    
      
Boss 拥有 Office ?Car cd的两个属性:    
  
清单 3. Boss.java    
                    
package com.baobaotao;    
   
public class Boss {    
    private Car car;    
    private Office office;    
   
    // 省略 get/setter    
   
    @Override   
    public String toString() {    
        return "car:" + car + "\n" + "office:" + office;    
    }    
}    
    
我们?Spring 容器中将 Office ?Car 声明?BeanQƈ注入?Boss Bean 中:下面是用传l?XML 完成q个工作的配|文?beans.xmlQ?nbsp;   
    
清单 4. beans.xml 以上三个类配置?Bean    
                    
<?xml version="1.0" encoding="UTF-8" ?>    
<beans xmlns="http://www.springframework.org/schema/beans"   
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    xsi:schemaLocation="http://www.springframework.org/schema/beans     
 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">    
    <bean id="boss" class="com.baobaotao.Boss">    
        <property name="car" ref="car"/>    
        <property name="office" ref="office" />    
    </bean>    
    <bean id="office" class="com.baobaotao.Office">    
        <property name="officeNo" value="002"/>    
    </bean>    
    <bean id="car" class="com.baobaotao.Car" scope="singleton">    
        <property name="brand" value=" U旗 CA72"/>    
        <property name="price" value="2000"/>    
    </bean>    
</beans>    
     
当我们运行以下代码时Q控制台正打?boss 的信息:    
  
清单 5. 试c:AnnoIoCTest.java    
                    
import org.springframework.context.ApplicationContext;    
import org.springframework.context.support.ClassPathXmlApplicationContext;    
public class AnnoIoCTest {    
   
    public static void main(String[] args) {    
        String[] locations = {"beans.xml"};    
        ApplicationContext ctx =     
            new ClassPathXmlApplicationContext(locations);    
        Boss boss = (Boss) ctx.getBean("boss");    
        System.out.println(boss);    
    }    
}    
    
q说?Spring 容器已经正确完成?Bean 创徏和装配的工作?nbsp;   
     
使用 @Autowired 注释    
   
Spring 2.5 引入?@Autowired 注释Q它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。来看一下?@Autowired q行成员变量自动注入的代码:    
  
清单 6. 使用 @Autowired 注释?Boss.java    
                    
package com.baobaotao;    
import org.springframework.beans.factory.annotation.Autowired;    
   
public class Boss {    
   
    @Autowired   
    private Car car;    
   
    @Autowired   
    private Office office;    
   
    …    
}    
       
Spring 通过一?BeanPostProcessor ?@Autowired q行解析Q所以要?@Autowired 起作用必M先在 Spring 容器中声?AutowiredAnnotationBeanPostProcessor Bean?nbsp;  

清单 7. ?@Autowired 注释工作h    
                    
<?xml version="1.0" encoding="UTF-8" ?>    
<beans xmlns="http://www.springframework.org/schema/beans"   
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    xsi:schemaLocation="http://www.springframework.org/schema/beans     
 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">    
   
    <!-- ?BeanPostProcessor 自动v作用Q对标注 @Autowired ?Bean q行自动注入 -->    
    <bean class="AutowiredAnnotationBeanPostProcessor  
        org.springframework.beans.factory.annotation.  "/>    
   
    <!-- U除 boss Bean 的属性注入配|的信息 -->    
    <bean id="boss" class="com.baobaotao.Boss"/>    
     
    <bean id="office" class="com.baobaotao.Office">    
        <property name="officeNo" value="001"/>    
    </bean>    
    <bean id="car" class="com.baobaotao.Car" scope="singleton">    
        <property name="brand" value=" U旗 CA72"/>    
        <property name="price" value="2000"/>    
    </bean>    
</beans>    
     
    
q?P?Spring 容器启动ӞAutowiredAnnotationBeanPostProcessor 扫?Spring 容器中所? BeanQ当发现 Bean 中拥?@Autowired 注释时就扑ֈ和其匚wQ默认按cd匚wQ的 BeanQƈ注入到对应的地方中去?nbsp;   
   
?照上面的配置QSpring 直接采?Java 反射机制?Boss 中的 car ?office q两个私有成员变量进行自动注入。所以对成员变量使用 @Autowired 后,您大可将它们?setter ҎQsetCar() ? setOffice()Q从 Boss 中删除?nbsp;   
   
当然Q您也可以通过 @Autowired Ҏ法或构造函数进行标注,来看下面的代码:    
    
清单 8. ?@Autowired 注释标注?Setter Ҏ?nbsp;   
                    
package com.baobaotao;    
   
public class Boss {    
    private Car car;    
    private Office office;    
   
     @Autowired   
    public void setCar(Car car) {    
        this.car = car;    
    }    
     
    @Autowired   
    public void setOffice(Office office) {    
        this.office = office;    
    }    
    …    
}    
     
q时Q@Autowired 查找被标注的方法的入参cd?BeanQƈ调用Ҏ自动注入q些 Bean。而下面的使用Ҏ则对构造函数进行标注:    
    
清单 9. ?@Autowired 注释标注在构造函C    
                    
package com.baobaotao;    
   
public class Boss {    
    private Car car;    
    private Office office;    
     
    @Autowired   
    public Boss(Car car ,Office office){    
        this.car = car;    
        this.office = office ;    
    }    
     
    …    
}    
       
׃ Boss() 构造函数有两个入参Q分别是 car ?officeQ@Autowired 分别寻扑֒它们cd匚w?BeanQ将它们作ؓ Boss(Car car ,Office office) 的入参来创徏 Boss Bean?nbsp;   
     
当候?Bean 数目不ؓ 1 时的应对Ҏ    
   
?默认情况下?@Autowired 注释q行自动注入ӞSpring 容器中匹配的候?Bean 数目必须有且仅有一个。当找不C个匹配的 Bean ӞSpring 容器抛?BeanCreationException 异常Qƈ指出必须臛_拥有一个匹配的 Bean。我们可以来做一个实验:    
   
   
清单 10. 候?Bean 数目?0 ?nbsp;   
                    
<?xml version="1.0" encoding="UTF-8" ?>    
<beans xmlns="http://www.springframework.org/schema/beans"   
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
     xsi:schemaLocation="http://www.springframework.org/schema/beans     
 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd ">    
     
    <bean class="AutowiredAnnotationBeanPostProcessor  
        org.springframework.beans.factory.annotation.  "/>     
   
    <bean id="boss" class="com.baobaotao.Boss"/>    
   
    <!-- ?office Bean 注释?-->    
    <!-- <bean id="office" class="com.baobaotao.Office">    
    <property name="officeNo" value="001"/>    
    </bean>-->    
   
    <bean id="car" class="com.baobaotao.Car" scope="singleton">    
        <property name="brand" value=" U旗 CA72"/>    
        <property name="price" value="2000"/>    
    </bean>    
</beans>    
     
׃ office Bean 被注释掉了,所?Spring 容器中将没有cd?Office ?Bean 了,?Boss ?office 属性标注了 @AutowiredQ当启动 Spring 容器Ӟ异常׃生了?nbsp;   
   
?不能定 Spring 容器中一定拥有某个类?Bean Ӟ可以在需要自动注入该c?Bean 的地方可以? @Autowired(required = false)Q这{于告诉 SpringQ在找不到匹?Bean 时也不报错。来看一下具体的例子Q?nbsp;   
   
   
清单 11. 使用 @Autowired(required = false)    
                    
package com.baobaotao;    
   
import org.springframework.beans.factory.annotation.Autowired;    
import org.springframework.beans.factory.annotation.Required;    
   
public class Boss {    
   
    private Car car;    
    private Office office;    
   
    @Autowired   
    public void setCar(Car car) {    
        this.car = car;    
    }    
    @Autowired(required = false)    
    public void setOffice(Office office) {    
        this.office = office;    
    }    
    …    
}    
    
?Ӟ一般情况下Q?@Autowired 的地斚w是需要注?Bean 的,使用了自动注入而又允许不注入的情况一般仅会在开发期或测试期到Q如Z快速启?Spring 容器Q仅引入一些模块的 Spring 配置文gQ,所?@Autowired(required = false) 会很用到?nbsp;   
   
和找不到一个类型匹?Bean 相反的一个错误是Q如?Spring 容器中拥有多个候?BeanQSpring 容器在启动时也会抛出 BeanCreationException 异常。来看下面的例子Q?nbsp;   
    
清单 12. ?beans.xml 中配|两?Office cd?Bean    
                    
…     
<bean id="office" class="com.baobaotao.Office">    
    <property name="officeNo" value="001"/>    
</bean>    
<bean id="office2" class="com.baobaotao.Office">    
    <property name="officeNo" value="001"/>    
</bean>    
…    
     
我们?Spring 容器中配|了两个cd?Office cd?BeanQ当?Boss ?office 成员变量q行自动注入ӞSpring 容器无法确定到底要用哪一?BeanQ因此异常发生了?nbsp;   
   
Spring 允许我们通过 @Qualifier 注释指定注入 Bean 的名Uͼq样歧义消除了Q可以通过下面的方法解军_常:    
  
清单 13. 使用 @Qualifier 注释指定注入 Bean 的名U?nbsp;   
                    
@Autowired   
public void setOffice(@Qualifier("office")Office office) {    
    this.office = office;    
}    
    
 
@Qualifier("office") 中的 office ?Bean 的名Uͼ所?@Autowired ?@Qualifier l合使用Ӟ自动注入的策略就?byType 转变?byName 了。@Autowired 可以Ҏ员变量、方法以及构造函数进行注释,?@Qualifier 的标注对象是成员变量、方法入参、构造函数入参。正是由于注释对象的不同Q所?Spring 不将 @Autowired ?@Qualifier l一成一个注释类。下面是Ҏ员变量和构造函数入参进行注释的代码Q?nbsp;   
   
Ҏ员变量进行注释:    
  
清单 14. Ҏ员变量?@Qualifier 注释    
                    
public class Boss {    
    @Autowired   
    private Car car;    
     
    @Autowired   
    @Qualifier("office")    
    private Office office;    
    …    
}    
     
    
Ҏ造函数入参进行注释:    
    
清单 15. Ҏ造函数变量?@Qualifier 注释    
                    
public class Boss {    
    private Car car;    
    private Office office;    
   
    @Autowired   
    public Boss(Car car , @Qualifier("office")Office office){    
        this.car = car;    
        this.office = office ;    
    }    
}    
     
@Qualifier 只能?@Autowired l合使用Q是?@Autowired 有益的补充。一般来Ԍ@Qualifier Ҏ法签名中入参q行注释会降低代码的可读性,而对成员变量注释则相对好一些?nbsp;   
    
   
使用 JSR-250 的注?nbsp;   
   
Spring 不但支持自己定义?@Autowired 的注释,q支持几个由 JSR-250 规范定义的注释,它们分别?@Resource、@PostConstruct 以及 @PreDestroy?nbsp;   
   
@Resource   
   
@Resource 的作用相当于 @AutowiredQ只不过 @Autowired ?byType 自动注入Q面 @Resource 默认?byName 自动注入|了。@Resource 有两个属性是比较重要的,分别?name ?typeQSpring ?@Resource 注释?name 属性解析ؓ Bean 的名字,?type 属性则解析?Bean 的类型。所以如果?name 属性,则?byName 的自动注入策略,而?type 属性时则?byType 自动注入{略。如果既不指?name 也不指定 type 属性,q时通过反射机制使用 byName 自动注入{略?nbsp;   
   
Resource 注释cM?Spring 发布包的 lib/j2ee/common-annotations.jar cd中,因此在用之前必d其加入到目的类库中。来看一个?@Resource 的例子:    
   
清单 16. 使用 @Resource 注释?Boss.java    
                    
package com.baobaotao;    
   
import javax.annotation.Resource;    
   
public class Boss {    
    // 自动注入cd?Car ?Bean    
    @Resource   
    private Car car;    
   
    // 自动注入 bean 名称?office ?Bean    
    @Resource(name = "office")    
    private Office office;    
}    
     
一般情况下Q我们无需使用cM?@Resource(type=Car.class) 的注释方式,因ؓ Bean 的类型信息可以通过 Java 反射从代码中获取?nbsp;   
   
要让 JSR-250 的注释生效,除了?Bean cM标注q些注释外,q需要在 Spring 容器中注册一个负责处理这些注释的 BeanPostProcessorQ?nbsp;   
   
<bean     
  class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>    
     
  
CommonAnnotationBeanPostProcessor 实现?BeanPostProcessor 接口Q它负责扫描使用?JSR-250 注释?BeanQƈ对它们进行相应的操作?nbsp;   
   
@PostConstruct ?@PreDestroy   
   
Spring 容器中的 Bean 是有生命周期的,Spring 允许?Bean 在初始化完成后以?Bean 销毁前执行特定的操作,您既可以通过实现 InitializingBean/DisposableBean 接口来定制初始化之后 / 销毁之前的操作ҎQ也可以通过 <bean> 元素?init-method/destroy-method 属性指定初始化之后 / 销毁之前调用的操作Ҏ。关? Spring 的生命周期,W者在《精?Spring 2.x—企业应用开发精解》第 3 章进行了详细的描qͼ有兴的读者可以查阅?nbsp;   
   
JSR-250 为初始化之后/销毁之前方法的指定定义了两个注释类Q分别是 @PostConstruct ? @PreDestroyQ这两个注释只能应用于方法上。标注了 @PostConstruct 注释的方法将在类实例化后调用Q而标注了 @PreDestroy 的方法将在类销毁之前调用?nbsp;   
  
清单 17. 使用 @PostConstruct ?@PreDestroy 注释?Boss.java    
                    
package com.baobaotao;    
   
import javax.annotation.Resource;    
import javax.annotation.PostConstruct;    
import javax.annotation.PreDestroy;    
   
public class Boss {    
    @Resource   
    private Car car;    
   
    @Resource(name = "office")    
    private Office office;    
   
    @PostConstruct   
    public void postConstruct1(){    
        System.out.println("postConstruct1");    
    }    
   
    @PreDestroy   
    public void preDestroy1(){    
        System.out.println("preDestroy1");     
    }    
    …    
}    
     
您只需要在Ҏ前标?@PostConstruct ?@PreDestroyQ这些方法就会在 Bean 初始化后或销毁之前被 Spring 容器执行了?nbsp;   
   
?们知道,不管是通过实现 InitializingBean/DisposableBean 接口Q还是通过 <bean> 元素? init-method/destroy-method 属性进行配|,都只能ؓ Bean 指定一个初始化 / 销毁的Ҏ。但是? @PostConstruct ?@PreDestroy 注释却可以指定多个初始化 / 销毁方法,那些被标?@PostConstruct ? @PreDestroy 注释的方法都会在初始?/ 销毁时被执行?nbsp;   
   
通过以下的测试代码,您将可以看到 Bean 的初始化 / 销毁方法是如何被执行的Q?nbsp;   
  
清单 18. 试cM?nbsp;   
                    
package com.baobaotao;    
   
import org.springframework.context.support.ClassPathXmlApplicationContext;    
   
public class AnnoIoCTest {    
   
    public static void main(String[] args) {    
        String[] locations = {"beans.xml"};    
        ClassPathXmlApplicationContext ctx =     
            new ClassPathXmlApplicationContext(locations);    
        Boss boss = (Boss) ctx.getBean("boss");    
        System.out.println(boss);    
        ctx.destroy();// 关闭 Spring 容器Q以触发 Bean 销毁方法的执行    
    }    
}    
     
   
q?Ӟ您将看到标注?@PostConstruct ?postConstruct1() Ҏ在 Spring 容器启动Ӟ创徏 Boss Bean 的时候被触发执行Q而标注了 @PreDestroy 注释?preDestroy1() Ҏ在 Spring 容器关闭前销? Boss Bean 的时候被触发执行?nbsp;   
       
使用 <context:annotation-config/> 化配|?nbsp;   
   
Spring 2.1 d了一个新?context ?Schema 命名I间Q该命名I间Ҏ释驱动、属性文件引入、加载期l入{功能提供了便捷的配|。我们知道注释本w是不会做Q何事情的Q它仅提供元数据信息。要使元?据信息真正v作用Q必让负责处理q些元数据的处理器工作v来?nbsp;    
   
而我们前面所介绍? AutowiredAnnotationBeanPostProcessor ?CommonAnnotationBeanPostProcessor 是处理q些注释元数据的处理器。但是直接在 Spring 配置文g中定义这?Bean 昑־比较W拙。Spring 为我们提供了一U方便的注册q些 BeanPostProcessor 的方式,q就? <context:annotation-config/>。请看下面的配置Q?nbsp;   
     
清单 19. 调整 beans.xml 配置文g    
                    
<?xml version="1.0" encoding="UTF-8" ?>    
<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">    
     
    <context:annotation-config/>     
   
    <bean id="boss" class="com.baobaotao.Boss"/>    
    <bean id="office" class="com.baobaotao.Office">    
        <property name="officeNo" value="001"/>    
    </bean>    
    <bean id="car" class="com.baobaotao.Car" scope="singleton">    
        <property name="brand" value=" U旗 CA72"/>    
        <property name="price" value="2000"/>    
    </bean>    
</beans>    
      
<context:annotationconfig/> 隐式地?Spring 容器注册 AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor?PersistenceAnnotationBeanPostProcessor 以及 equiredAnnotationBeanPostProcessor q?4 ?BeanPostProcessor?nbsp;   
   
在配|文件中使用 context 命名I间之前Q必d <beans> 元素中声?context 命名I间?nbsp;   
   
    
使用 @Component   
   
?然我们可以通过 @Autowired ?@Resource ?Bean cM使用自动注入功能Q但?Bean q是?XML 文g中通过 <bean> q行定义 —— 也就是说Q在 XML 配置文g中定?BeanQ通过 @Autowired ?@Resource ? Bean 的成员变量、方法入参或构造函数入参提供自动注入的功能。能否也通过注释定义 BeanQ从 XML 配置文g中完全移?Bean 定义的配|呢Q答案是肯定的,我们通过 Spring 2.5 提供?@Component 注释可以达到这个目标了?nbsp;   
   
下面Q我们完全用注释定?Bean q完?Bean 之间装配Q?nbsp;   
   
   
清单 20. 使用 @Component 注释?Car.java    
                    
package com.baobaotao;    
   
import org.springframework.stereotype.Component;    
   
@Component   
public class Car {    
    …    
}    
     
     
仅需要在cd义处Q?@Component 注释可以将一个类定义?Spring 容器中的 Bean。下面的代码?Office 定义Z?BeanQ?nbsp;   
    
清单 21. 使用 @Component 注释?Office.java    
                    
package com.baobaotao;    
   
import org.springframework.stereotype.Component;    
   
@Component   
public class Office {    
    private String officeNo = "001";    
    …    
}    
     
q样Q我们就可以?Boss cM通过 @Autowired 注入前面定义?Car ?Office Bean 了?nbsp;   
   
清单 22. 使用 @Component 注释?Boss.java    
                    
package com.baobaotao;    
   
import org.springframework.beans.factory.annotation.Autowired;    
import org.springframework.beans.factory.annotation.Required;    
import org.springframework.beans.factory.annotation.Qualifier;    
import org.springframework.stereotype.Component;    
   
@Component("boss")    
public class Boss {    
    @Autowired   
    private Car car;    
   
    @Autowired   
    private Office office;    
    …    
}    
    
@Component 有一个可选的入参Q用于指?Bean 的名Uͼ?Boss 中,我们将 Bean 名称定义?#8220;boss”。一般情况下QBean 都是 singleton 的,需要注?Bean 的地方仅需要通过 byType {略可以自动注入了Q所以大可不必指?Bean 的名U?nbsp;   
   
在?@Component 注释后,Spring 容器必须启用cL描机制以启用注释驱动 Bean 定义和注释驱?Bean 自动注入的策略。Spring 2.5 ?context 命名I间q行了扩展,提供了这一功能Q请看下面的配置Q?nbsp;   
    
清单 23. 化版?beans.xml    
                    
<?xml version="1.0" encoding="UTF-8" ?>    
<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">    
    <context:component-scan base-package="com.baobaotao"/>    
</beans>    
      
q?里,所有通过 <bean> 元素定义 Bean 的配|内容已l被U除Q仅需要添加一? <context:component-scan/> 配置px有问题了——Spring XML 配置文g得到了极致的化(当然配置元数据还是需要的Q只不过以注释Ş式存在Ş了)?lt;context:component-scan/> ? base-package 属性指定了需要扫描的cdQ类包及光归子包中所有的c都会被处理?nbsp;   
   
<context:component-scan/> q允许定义过滤器基包下的某些类U_或排除。Spring 支持以下 4 U类型的qo方式Q通过下表说明Q?nbsp;   
   
?1. 扫描qo方式    
qo器类?说明     
注释 假如 com.baobaotao.SomeAnnotation 是一个注释类Q我们可以将使用该注释的c过滤出来?nbsp;    
cd指定 通过全限定类名进行过滤,如您可以指定?com.baobaotao.Boss U_扫描Q而将 com.baobaotao.Car 排除在外?nbsp;    
正则表达?通过正则表达式定义过滤的c,如下所C: com\.baobaotao\.Default.*     
AspectJ 表达?通过 AspectJ 表达式定义过滤的c,如下所C: com. baobaotao..*Service+     
   
下面是一个简单的例子Q?nbsp;   
   
<context:component-scan base-package="com.baobaotao">    
    <context:include-filter type="regex"     
        expression="com\.baobaotao\.service\..*"/>    
    <context:exclude-filter type="aspectj"     
        expression="com.baobaotao.util..*"/>    
</context:component-scan>    
      
?得注意的?<context:component-scan/> 配置不但启用了对类包进行扫描以实施注释驱动 Bean 定义的功能,同时q启用了注释驱动自动注入的功能(卌隐式地在内部注册?AutowiredAnnotationBeanPostProcessor ?CommonAnnotationBeanPostProcessorQ,因此当? <context:component-scan/> 后,可以将 <context:annotation-config/> U除了?nbsp;   
   
默认情况下通过 @Component 定义?Bean 都是 singleton 的,如果需要用其它作用范围的 BeanQ可以通过 @Scope 注释来达到目标,如以下代码所C:    
   
清单 24. 通过 @Scope 指定 Bean 的作用范?nbsp;   
                    
package com.baobaotao;    
import org.springframework.context.annotation.Scope;    
…    
@Scope("prototype")    
@Component("boss")    
public class Boss {    
    …    
}    
     
q样Q当?Spring 容器中获?boss Bean Ӟ每次q回的都是新的实例了?nbsp;   
      
采用hҎ语义的注?nbsp;   
   
Spring 2.5 中除了提?@Component 注释外,q定义了几个拥有Ҏ语义的注释,它们分别是:@Repository、@Service ? @Controller。在目前?Spring 版本中,q?3 个注释和 @Component 是等效的Q但是从注释cȝ命名上,很容易看 3 个注释分别和持久层、业务层和控制层QWeb 层)相对应。虽然目前这 3 个注释和 @Component 相比没有什么新意,?Spring 在以后的版本中为它们添加特D的功能。所以,如果 Web 应用E序采用了经典的三层分层l构的话Q最好在持久层、业务层和控制层分别采用 @Repository、@Service ?@Controller 对分层中的类q行注释Q而用 @Component 寚w些比较中立的c进行注释?nbsp;   
        
注释配置?XML 配置的适用场合    
   
是否有了q些 IOC 注释Q我们就可以完全摒除原来 XML 配置的方式呢Q答案是否定的。有以下几点原因Q?nbsp;   
   
?释配|不一定在先天上优?XML 配置。如?Bean 的依赖关pL固定的,Q如 Service 使用了哪几个 DAO c)Q这U配|信息不会在部v时发生调_那么注释配置优于 XML 配置Q反之如果这U依赖关pM在部|时发生调整QXML 配置昄又优于注释配|,因ؓ注释是对 Java 源代码的调整Q您需要重新改写源代码q新编译才可以实施调整?nbsp;    
如果 Bean 不是自己~写的类Q如 JdbcTemplate、SessionFactoryBean {)Q注释配|将无法实施Q此?XML 配置是唯一可用的方式?nbsp;    
注释配置往往是类U别的,?XML 配置则可以表现得更加灉|。比如相比于 @Transaction 事务注释Q?aop/tx 命名I间的事务配|更加灵zd单?nbsp;    
所 以在实现应用中,我们往往需要同时用注释配|和 XML 配置Q对于类U别且不会发生变动的配置可以优先考虑注释配置Q而对于那些第三方cM及容易发生调整的配置则应优先考虑使用 XML 配置。Spring 会在具体实施 Bean 创徏?Bean 注入之前这两种配置方式的元信息融合在一赗?nbsp;   
       
结    
   
Spring ?2.1 以后Ҏ释配|提供了强力的支持,注释配置功能成ؓ Spring 2.5 的最大的亮点之一。合理地使用 Spring 2.5 的注释配|,可以有效减少配置的工作量Q提高程序的内聚性。但是这q不意味着传统 XML 配置走向消亡,在第三方c?Bean 的配|,以及那些诸如数据源、缓存池、持久层操作模板cR事务管理等内容的配|上QXML 配置依然拥有不可替代的地位?/div>

AK47 2011-10-10 15:49 发表评论
]]> վ֩ģ壺 Ļ޾Ʒһ| þѾƷһ| Ƶվѹۿ| һëƬ޶| ŷղþ99| ߹ۿƬAVվ| ձvѷƵ| ޺ݺݰۺӰԺ| ¶ɫ| ۺɫ߲| ޳˸߹ۿ| վ߿| պvavaŷva| ŷ| ɫ߳Ƶ| wwwxxx| þֻƷ10| ޾Ʒa߹ۿ| Ƶ| ˳Ƶ| Ļ| þҹҹ³³ƬӰ| ߿ƬvѹۿƵ777| ޾ƷԴ26u| ɫۺϽѹۿ| ҹƷ| 99þۺϾƷ| avҹƬƷվ| 2018Ƶ| 츾ëXXXX| ¸Ļ| ëƬƵ| һ| 97޾ƷȫƵ| ŮƵһ| δʮ18ֹվ| 999ھƷѹۿ| ɫ18վWWW߲| Ļѹۿ| ˳ۺ| Ƶۿ|