Spring学习九:用@Resource注解完成属性装配


一、通过之前学习知道注入依赖对象有:手工装配和自动装配。

手工装配又有两种装配方式:

(1)、在XML 配置文件中,通过 bean 节点配置,如下:


(2)、在java 代码中使用@Autowired 或者 @Resource 注解方式进行装配,但是需要在xml 配置文件中配置一下信息:

 

这个配置隐式注册了多个对注释进行解析出来的处理器:

AutowiredAnnotationBeanPostProcessor 、CommonAnnotationBeanPostProcessor
PersistenceAnnotationBeanPostProcessor、RequiredAnnotationBeanPostProcessor
其实,注解本身做不了任何事情,和XML一样,只起到配置的作用,主要在于背后强大的处理器 。

另外,比较建议使用@Resource注解,而不要使用@Autowired注解。因为@Autowired注解是Spring提供的,而@Resource注解是J2EE提供的 ,在JDK6中就已经包含@Resource注解了,所以它没有跟Spring紧密耦合,并且在使用Spring时,若使用了JSR-250中的注解,如@Resource//@PostConstruct//@PreDestroy ,那么还需要Spring安装目录中的SPRING_HOME\\lib\\j2ee\\common-annotations.jar包的支持,这里面的@Resource注解就是在SPRING_HOME\\lib\\j2ee\\common-annotations.jar中的 。

@Resource注解
@Resource注解和@Autowired一样,也可以标注在字段或属性的setter方法上
@Resource默认按名称装配,名称可以通过name属性指定。当找不到与名称匹配的bean时,才会按类型装配
若注解标注在字段上且未指定name属性,则默认取字段名作为bean名称寻找依赖对象
若注解标注在setter上且未指定name属性,则默认取属性名作为bean名称寻找依赖对象
如果没有指定name属性,并且按照默认的名称仍找不到依赖对象时,它就会按类型匹配
但只要指定了name属性,就只能按名称装配了

@Autowired注解
@Autowired默认是按类型装配对象的,默认情况下它要求依赖对象必须存在
如果允许null值,可以设置它的required属性为FALSE,如@Autowired(required=false)
若想要按名称装配,可以结合@Qualifier注解一起使用,如@Autowired(required=false)  @Qualifier("personDaoBean")

 

二、学习用注解的方式装配:

1、导入common-annotations.jar 包,下载地址:http://www.java2s.com/Code/Jar/c/Downloadcommonannotationsjar.htm

2、在 java代码中使用@Resource注解 或@Autowired注解方式进行装配,它们的区别是:

@Autowired默认是按类型装配对象的,@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型专配。

@Autowired
private PersonDao  personDao;//用于字段上
@Autowired
public void setOrderDao(OrderDao orderDao) {//用于属性的setter方法上
       this.orderDao = orderDao;
}

@Autowired注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false。如果我们想使用按名称装配,可以结合 @Qualifier 注解一起使用。如下:

@Autowired  @Qualifier("personDaoBean")
private PersonDao  personDao;

@Resource注解和 @Autowired一样,也可以标注在字段或属性的setter方法上,但它默认按名称装配。名称可以通过 @Resource的name属性指定,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。

@Resource(name=“personDaoBean”)
private PersonDao  personDao;//用于字段上

注意:如果没有指定name属性,并且按照默认的名称仍然找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。

3、实例, PresonServiceImpl 类,代码如下:

通过上面讲解知道,@Resource注解方式默认按名称装配,所以会取字段的名称 presonDao 作为bean名称寻找依赖对象 。(上面的 PresonDao 接口和所对应的类,在之前有讲过)

4、xml 文件如下:

 

5、单元测试:

 

如果我们将 xml 中 id=“personDao” 改为 id=“person” ,那么通过@Resource注解是找不到以字段 presonDao 作为 bean 名称的依赖对象,这是会按类型装配,即@Autowired 注解。当然也可以明确的指定 name 属性,即

@Resource(name="preson") private PresonDao presonDao;

一旦指定了name属性,就只能按名称装配。所以会去找到 xml 文件中 id=“preson” 的 bean。

6、也可以使用属性的setter 方法, 修改 PresonServiceImpl 类,代码如下:


@Resource注解和@Autowired一样,也可以标注在字段或属性的setter方法上,但它默认按名称装配。当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM