spring2.5注解驱动(一)@Autowired and @Resource

注释配置相对于 XML 配置具有很多的优势: 
它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作。如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO 的属性名、类型等信息,如果关系表字段和 PO 属性名、类型都一致,您甚至无需编写任务属性映射信息——因为这些信息都可以通过 Java 反射机制获取。 
注释和 Java 代码位于一个文件中,而 XML 配置采用独立的配置文件,大多数配置信息在程序开发完成后都不会调整,如果配置信息和 Java 代码放在一起,有助于增强程序的内聚性。而采用独立的 XML 配置文件,程序员在编写一个功能时,往往需要在程序文件和配置文件中不停切换,这种思维上的不连贯会降低开发效率。 
因此在很多情况下,注释配置比 XML 配置更受欢迎,注释配置有进一步流行的趋势。Spring 2.5 的一大增强就是引入了很多注释类,现在您已经可以使用注释配置完成大部分 XML 配置的功能。

@Autowired,按照类型注入

@Resource,默认按照名称注入,如果名称没有指定,则按照类型注入

@Resource 的作用相当于 @Autowired,只不过 @Autowired 按 byType 自动注入,面 @Resource 默认按 byName 自动注入罢了。@Resource 有两个属性是比较重要的,分别是 name 和 type,Spring 将 @Resource 注释的 name 属性解析为 Bean 的名字,而 type 属性则解析为 Bean 的类型。所以如果使用 name 属性,则使用 byName 的自动注入策略,而使用 type 属性时则使用 byType 自动注入策略。如果既不指定 name 也不指定 type 属性,这时将通过反射机制使用 byName 自动注入策略。

Java代码

package  com.baobaotao;       
public   class  Office {       
     private  String officeNo =” 001 ”;       
      
     //省略 get/setter       
      
     @Override       
     public  String toString() {       
         return   "officeNo:"  + officeNo;       
    }       
}    

 


package  com.baobaotao;       
      
public   class  Car {       
     private  String brand;       
     private   double  price;       
      
     // 省略 get/setter       
      
     @Override       
     public  String toString() {       
         return   "brand:"  + brand +  ","  +  "price:"  + price;       
    }       
}    

 

package  com.baobaotao;       
      
public   class  Boss {       
     private  Car car;       
     private  Office office;       
      
     // 省略 get/setter       
      
     @Override       
     public  String toString() {       
         return   "car:"  + car +  "\n"  +  "office:"  + office;       
    }       
}     

普通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"       
    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= " 红旗 CA72" />      
        <property name= "price"  value= "2000" />      
    </bean>      
</beans> 

使用 @Autowired 注释 ,必须在dtd中声明,否则会出现异常
Spring 2.5 引入了 @Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。

@Autowired 按照类型来装配

改变如下:

package  com.baobaotao;       
import  org.springframework.beans.factory.annotation.Autowired;       
      
public   class  Boss {       
      
     @Autowired       
     private  Car car;       
      
     @Autowired       
     private  Office office;       
      
    …       

<?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 将自动起作用,对标注  @Autowired  的 Bean 进行自动注入 -->      
    <bean  class ="org.springframework.beans.factory.annotation.       
        AutowiredAnnotationBeanPostProcessor"/>      
      
    <!-- 移除 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= " 红旗 CA72" />      
        <property name= "price"  value= "2000" />      
    </bean>      
</beans>   

这样,当 Spring 容器启动时,AutowiredAnnotationBeanPostProcessor 将扫描 Spring 容器中所有 Bean,当发现 Bean 中拥有 @Autowired 注释时就找到和其匹配(默认按类型匹配)的 Bean,并注入到对应的地方中去。 

按照上面的配置,Spring 将直接采用 Java 反射机制对 Boss 中的 car 和 office 这两个私有成员变量进行自动注入。所以对成员变量使用 @Autowired 后,您大可将它们的 setter 方法(setCar() 和 setOffice())从 Boss 中删除。 

当然,您也可以通过 @Autowired 对方法或构造函数进行标注,来看下面的代码

将注解@Autowired放在方法上
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;       
    }       
    …       
}   

将 @Autowired 注释标注在构造函数上

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 ;       
    }       
        
    …       

 

原文地址 http://blog.163.com/www_jiangtao/blog/static/24915273201061992240217/

-------------------------------

Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource、@PostConstruct以及@PreDestroy。
  @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
  @Resource装配顺序
  1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
  2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
  3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
  4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值