@Autowired和@Resource注解的注入顺序

注:本文中所有的“@Autowired和@Resource注入的先手顺序”一词都是指两个注解类是先通过Type注入还是先通过Name注入,并非是指两个注解在spring中执行的先后顺序

最近听子路老师讲课,课上讲解关于@Autowired和@Resource是先通过type还是先通过name注入属性的知识有点心得。

子路老师从源码的角度给大家讲了两个注解的先后顺序,但是如何通过应用的层面来进行验证呢?经过一番思考,想到了一种情况可以证明,分享给大家

1、创建一个FeiyangConfig配置类,添加扫描注解

@Configuration
@ComponentScan("com.feiyang")
public class FeiyangConfig {
}

2、创建一个Zilu类和Feiyang类并交给spring容器管理

@Component
public class Zilu {
}
@Component
public class Feiyang {
}

3、创建一个Luban类,为该类添加Zilu feiyang和Feiyang zilu属性并添加@Autowired注解,提供一个打印两个属性的方法@Component

 

复制代码

@Component
public class Luban {

    @Autowired
    private Feiyang zilu;

    @Autowired
    private Zilu feiyang;

    public void print() {
        System.out.println("Feiyang zilu = " + zilu);
        System.out.println("Zilu feiyang = " + feiyang);
    }

}

复制代码

 

4、新建一个测试类,初始化spring容器,获取Luban bean,调用打印方法

复制代码

public class Test {

    public static void main(String[] args) {
        ApplicationContext ac = new AnnotationConfigApplicationContext(FeiyangConfig.class);
        ac.getBean(Luban.class).print();
    }

}

复制代码

5、运行代码,可以看到控制台打印信息

Feiyang zilu = com.feiyang.model.Feiyang@69a10787
Zilu feiyang = com.feiyang.model.Zilu@2d127a61

得出结论:@Autowired是先通过Type注入,后通过Name注入的。因为如果是先通过Name注入,那么Feiyang zilu注入的就应该是Zilu bean,而Zilu bean注入给Feiyang类型的属性必定会报错,所以不可能是先通过Name注入,只能是先通过Type注入的。
6、将两个属性的@Autowired注解修改为@Resource注解

复制代码

@Component
public class Luban {

    @Resource
    private Feiyang zilu;

    @Resource
    private Zilu feiyang;

    public void print() {
        System.out.println("Feiyang zilu = " + zilu);
        System.out.println("Zilu feiyang = " + feiyang);
    }

}

复制代码

由于@Resource是先通过Name注入的,所以初始化spring的时候一定会报错。为了验证结果,我们重复一遍4的步骤,控制台打印信息如下

复制代码

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'luban': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'zilu' is expected to be of type 'com.feiyang.model.Feiyang' but was actually of type 'com.feiyang.model.Zilu'
Error creating bean with name 'luban': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'zilu' is expected to be of type 'com.feiyang.model.Feiyang' but was actually of type 'com.feiyang.model.Zilu'

复制代码

这个报错信息的意思是创建Luban这个bean的时候失败,失败原因是注入名称为zilu的bean的时候应该是注入一个Feiyang类型的bean,但是获取到的却是Zilu类型的bean,这就说明@Resource是先通过Name注入的

总结:@Autowired和@Resource注入的先后顺序的结果大家都是知道的,本次只是通过应用的层面来侧面证明一下,以后有机会可以从源码角度和大家分享一下它们注入的先后顺序

在Spring框架中,@Autowired和@Resource注解都用于实现依赖注入,但它们有几个区别。 1. 来源不同:@Autowired来自Spring框架,而@Resource来自Java的JSR-250规范。 2. 依赖查找的顺序不同:@Autowired先根据类型再根据名称查询,而@Resource先根据名称再根据类型查询。 3. 支持的参数不同:@Autowired只支持设置一个参数,而@Resource支持设置七个参数。 4. 依赖注入的用法支持不同:@Autowired既支持构造方法注入,又支持属性注入和Setter注入,而@Resource只支持属性注入和Setter注入。 5. 编译器的提示不同:当注入Mapper对象时,使用@Autowired注解编译器会提示错误,而使用@Resource注解则不会提示错误。 总结起来,@Autowired和@Resource注解在依赖注入的实现方式、使用参数和编译器提示等方面有所不同。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Spring框架中 @Autowired 和 @Resource 注解的区别](https://download.csdn.net/download/weixin_38524871/14888410)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [面试突击:@Autowired 和 @Resource 有什么区别?你学会了吗?](https://blog.csdn.net/Candyz7/article/details/126578224)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值