Spring学习九:用@Resource注解完成属性装配
本文内容纲要:Spring学习九:用@Resource注解完成属性装配
一、通过之前学习知道注入依赖对象有:手工装配和自动装配。
手工装配又有两种装配方式:
(1)、在XML 配置文件中,通过 bean 节点配置,如下:
<bean id="personService" class="com.learn.service.impl.PresonServiceImpl"> <property name="presonDao" ref="XXX"></property>
<constructor-arg index="1" value="XXX"></constructor-arg>
</bean>
(2)、在java 代码中使用@Autowired 或者 @Resource 注解方式进行装配,但是需要在xml 配置文件中配置一下信息:
<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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
</beans>
这个配置隐式注册了多个对注释进行解析出来的处理器:
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 类,代码如下:
package com.learn.service.impl;import javax.annotation.Resource;
import com.learn.dao.PresonDao;
import com.learn.service.PresonService;
/**
* 业务层
* @author Administrator
*
*/
public class PresonServiceImpl implements PresonService {
@Resource private PresonDao presonDao;
private String name;
public PresonServiceImpl(){
}
public PresonServiceImpl(PresonDao presonDao, String name) {
this.presonDao = presonDao;
this.name = name;
}
/* (non-Javadoc)
* @see com.learn.service.impl.PresonService#save()
*/
@Override
public void save(){
presonDao.add();
}
}
通过上面讲解知道,@Resource注解方式默认按名称装配,所以会取字段的名称 presonDao 作为bean名称寻找依赖对象 。(上面的 PresonDao 接口和所对应的类,在之前有讲过)
4、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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<bean id="personDao" class="com.learn.dao.impl.PresonDaoImpl"></bean>
<bean id="personService" class="com.learn.service.impl.PresonServiceImpl"></bean>
</beans>
5、单元测试:
package junit.test;import static org.junit.Assert.*;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.learn.service.PresonService;
public class TestSpring {
@Test
public void initContainerSpring() {
//实例化spring容器 (使用类构造器实例化)
AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("com//learn//spring//learn1.xml");
PresonService personService = (PresonService)ctx.getBean("personService");
personService.save();
}
}
如果我们将 xml 中 id=“personDao” 改为 id=“person” ,那么通过@Resource注解是找不到以字段 presonDao 作为 bean 名称的依赖对象,这是会按类型装配,即@Autowired 注解。当然也可以明确的指定 name 属性,即
@Resource(name="preson") private PresonDao presonDao;
一旦指定了name属性,就只能按名称装配。所以会去找到 xml 文件中 id=“preson” 的 bean。
6、也可以使用属性的setter 方法, 修改 PresonServiceImpl 类,代码如下:
package com.learn.service.impl;import javax.annotation.Resource;
import com.learn.dao.PresonDao;
import com.learn.service.PresonService;
/**
* 业务层
* @author Administrator
*
*/
public class PresonServiceImpl implements PresonService {
private PresonDao presonDao;
private String name;
public PresonServiceImpl(){
}
public PresonServiceImpl(PresonDao presonDao, String name) {
this.presonDao = presonDao;
this.name = name;
}
@Resource
public void setPresonDao(PresonDao presonDao) {
this.presonDao = presonDao;
}
/* (non-Javadoc)
* @see com.learn.service.impl.PresonService#save()
*/
@Override
public void save(){
//System.out.println("name="+name);
presonDao.add();
}
}
@Resource注解和@Autowired一样,也可以标注在字段或属性的setter方法上,但它默认按名称装配。当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。
本文内容总结:Spring学习九:用@Resource注解完成属性装配
原文链接:https://www.cnblogs.com/hwlsniper/p/3443362.html
以上是 Spring学习九:用@Resource注解完成属性装配 的全部内容, 来源链接: utcz.com/z/296429.html