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

本文内容纲要:Spring学习九:用@Resource注解完成属性装配

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

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

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

ImageImage

<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 配置文件中配置一下信息:

ImageImage

<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 类,代码如下:

ImageImage

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 文件如下:

ImageImage

<?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、单元测试:

ImageImage

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 类,代码如下:

ImageImage

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

回到顶部