Spring @Resource和@Autowired注解

    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接口实现类:

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

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

@Component
public 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来解决这些问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值