`
litxuf
  • 浏览: 122462 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;

 

分享到:
评论

相关推荐

    (转)Spring中@Autowired注解和@Resource注解的区别

    在Spring框架中,`@Autowired`和`@Resource`注解是两个常见的依赖注入(DI, Dependency Injection)工具,它们都是用来解决组件之间的耦合问题,使得代码更加灵活和可测试。然而,这两个注解在具体使用时有一些关键性...

    Spring注解@Resource和@Autowired.doc

    Spring 注解@Resource 和@Autowired Spring 框架中提供了两个重要的注解,分别是@Resource 和@Autowired,它们都是用于 bean 的自动装配的。了解这两个注解的区别和使用场景是非常重要的。 首先,@Autowired 是 ...

    详解Spring注解--@Autowired、@Resource和@Service

    Spring注解详解 -- @Autowired、@Resource和@Service Spring框架中有三个非常重要的注解,即@Autowired、@Resource和@Service。这三个注解都是Spring框架中最常用的注解,它们都是用于解决Spring框架中的依赖注入...

    Spring In Action 使用@Autowired 和@ Resource 自动装配Bean

    在Spring框架中,`@Autowired`和`@Resource`都是用于自动装配Bean的重要注解,它们简化了依赖注入的过程,使得代码更加简洁、易于维护。本文将深入探讨这两个注解的使用、区别以及如何在实际开发中应用它们。 首先...

    Spring使用@Autowired注解自动装配

    在Spring框架中,`@Autowired`注解是一个关键特性,用于简化依赖注入的过程。依赖注入是一种设计模式,它允许我们解耦代码,提高模块的可测试性和可维护性。在这个主题中,我们将深入探讨`@Autowired`的工作原理、...

    【Java面试】@Resource 和 @Autowired 的区别.doc

    在使用 @Autowired 注解时,如果在 Spring IOC 容器里面存在多个相同类型的 Bean 实例,那么 Spring 启动的时候,会提示一个错误,大概意思原本只能注入一个单实例 Bean,但是在 IOC 容器里面却发现有多个,导致注入...

    详解Spring依赖注入:@Autowired,@Resource和@Inject区别与实现原理

    Spring 依赖注入:@Autowired,@Resource 和@Inject 区别与实现原理 Spring 依赖注入是指在应用程序中将对象之间的依赖关系自动装配的过程。Spring 框架提供了多种依赖注入方式,包括 @Autowired、@Resource 和@...

    Spring框架中 @Autowired 和 @Resource 注解的区别

    在Spring框架中,注解是实现依赖注入的重要方式,其中包括`@Autowired`和`@Resource`两个常用的注解。它们虽然都可以用来注入依赖,但在实际使用中存在一些区别。 首先,`@Autowired`注解是Spring框架特有的,主要...

    SSH笔记-通过@Autowired配置注入关系

    在Spring框架中,`@Autowired`注解是一个关键特性,用于自动装配Bean的依赖。它极大地简化了传统XML配置中的bean依赖注入过程。本笔记将深入探讨如何在Spring 4中利用`@Autowired`注解配置注入关系,以及它与前一篇...

    Spring注解@Resource和@Autowired区别对比详解

    主要介绍了Spring注解@Resource和@Autowired区别对比详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    1.@Resource是按名称进行注入的,属于java自带的。@Autowired是按类型进行注入的,属于Spring。.pdf

    Spring框架是Java领域中实现DI的典型代表,提供了多种注解来支持这一机制,其中两个常用的注解是`@Resource`和`@Autowired`。虽然它们都可以用来实现依赖注入,但它们的用法和原理有所不同。 首先,`@Resource`注解...

    Spring2.5注解(标注)学习笔记

    #### 一、Spring2.5中的四个常用注解 在Spring2.5中,有四个常用的注解特别值得关注:`@Resource`、`@Qualifier`、`@Service` 和 `@Repository`。 ##### 1. `@Resource` `@Resource` 注解主要用于依赖注入,它...

    spring mvc+ibatis+spring2.5注解

    在实际项目中,"springdemo3" 这个文件可能包含了一个简单的 Spring MVC + iBatis + Spring 2.5 注解的应用示例,其中包括配置文件(如 applicationContext.xml 和 servlet-context.xml)、Controller 类、Service ...

    spring3注解详细

    @Resource 是 JSR-250 标准注解,推荐使用它来替代 Spring 专有的 @Autowired。@Resource 默认按照 Bean 的名字(byName)进行注入,而 @Autowired 默认按照类型(byType)进行注入。@Resource 的 name 和 type 属性可以...

    spring 2.5 注解

    3. **注解驱动的依赖注入**:Spring 2.5允许开发者使用注解替代XML配置来声明依赖关系。这不仅使代码更简洁,还减少了XML配置文件的体积。例如,使用@Autowired注解可以自动注入匹配类型的bean: ```java @Autowired...

    spring2.5中文文档

    开发者可以使用`@Autowired`、`@Qualifier`和`@Resource`等注解来简化装配过程,无需编写XML配置文件。 2. **注解驱动的开发**:Spring 2.5引入了大量的注解,如`@Controller`、`@Service`、`@Repository`和`@...

    学习Spring笔记_Annotation(注解)_Autowired_Qualifier

    在工具方面,IDEA等现代Java集成开发环境提供了对Spring注解的强大支持,如代码提示、自动完成、重构等,使得开发过程更加高效。同时,对于复杂的项目,使用Maven或Gradle构建工具管理依赖,结合Spring Boot等快速...

    spring annotation注解

    Spring 框架提供了多种类型的注解,例如 @Autowired、@Resource、@Component 等。 1. 使用 Spring 注解来注入属性 在使用 Spring 框架之前,我们通常使用 setter 方法来注入属性,例如: Java 代码 ```java ...

    Spring2.5_注解介绍(3.0通用)

    Spring框架在2.5版本引入了对注解的广泛支持,这一特性在后续的3.0版本中得到了进一步增强,并且成为了Spring应用的核心部分。注解的使用极大地简化了Spring配置,提高了代码的可读性和可维护性。下面将详细介绍其中...

    Spring2.5 注解介绍(3.0通用)

    Spring 2.5引入了对注解的强大支持,这些注解在Spring 3.0之后仍然通用,极大地简化了配置并增强了代码的可读性。本文将详细介绍Spring中的一些核心注解及其用法。 首先,要使注解生效,我们需要在Spring配置中注册...

Global site tag (gtag.js) - Google Analytics