Spring @Resource和@Autowired注解

来源:互联网 发布:网络面临的安全威胁 编辑:程序博客网 时间:2024/04/30 01:47

    Spring的@Resource@Autowired的注解都可以完成对象依赖注入功能,但相信很多人跟我一样,对这两者的注解区别不是很清楚。经过查阅各个大牛的博客后,写下此博文来简单的总结与分享。(ps: 本文是在《Spring Resource、Autowired、Qualifier的注解注入及区别》的基础上进行进一步总结,感谢OrderDong作者的分享。),接下来直接进入主题:
    Spring提供了一种优秀的解耦方式,使用XML配置文件或者注解的方式来管理Bean的实现类和依赖关系。其中,在注解中可以使用@Resource或者@Autowired来完成注入。虽然这两个注解都可以完成依赖注入,但它们之间是有区别的。
(a). 默认是按byType or byName来注入
    @Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入;
    @Autowired默认是按照类型装配注入的,如果想按照名称来转配注入,则需要结合@Qualifier一起使用;
(b). jar包
    @Resource注解是由J2EE提供,而@Autowired是由spring提供。需要特别说明的是,如果要使用@Resource,需要导入annotation-api.jar包,tomcat已经包含了这个jar包。如果工程不是web项目,那就通过maven导入这个包。
(c). 共同点
    @Resource和@Autowired都可以标注在字段或者该字段的setter方法上。

    说了它们的区别和共同点,下面就谈下怎么使用。

举例

1、XML配置文件

使用注解的方式,需要修改Spring 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/>        <context:component-scan base-package="com.lemory.controller"/></beans>

2、注入Bean

    修改XML配置文件后,可以通过注解方式来注入bean。为了简单,本文使用教程中案例代码来说明。

(1)定义接口

    定义Person接口:

public interface Person {    void useAxe();}

    定义Axe接口:

public interface Axe {    String chop();}

(2)实现类

    Axe接口实现类:

@Componentpublic class StoneAxe implements Axe{    public String chop() {        return "石斧砍柴有点慢";    }}
    Person接口实现类:
a. 使用@Resource注入Axe实现类。
@Componentpublic class Chinese implements Person {    @Resource    private Axe axe;    public void useAxe() {        System.out.println(axe.chop());    }}

     b. 使用@Autowired注入Axe实现类。

@Componentpublic class Chinese implements Person {    @Autowired    private Axe axe;    public void useAxe() {        System.out.println(axe.chop());    }}

(3)测试类代码

    使用Spring test测试。

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations={"classpath:application.xml"})public class BeanTest {    @Autowired    private Person person;    @Test    public void useAxeTest() {        Assert.assertNotNull(person);        person.useAxe();    }}

(4)测试结果

    a. @Resource

石斧砍柴有点慢

    b. @Autowired

石斧砍柴有点慢

    从上述测试结果可以看出,使用@Resource@Autowired都可以完成依赖注入。 但由于@Autowired它首先会根据类型去查找,如果Spring上下文存在多个类实现了Axe接口的话,就会抛出BeanCreationException异常,可以使用@Qualifier配合@Autowired来解决这些问题。

原创粉丝点击