当前位置: 首页 > news >正文

深入剖析 @Autowired 和 @Resource 在 Spring 中的区别

在 Spring 框架中,@Autowired 和 @Resource 是两个常用的注解,用于实现依赖注入。尽管它们都能达到将依赖对象注入到目标 bean 的目的,但在细节上存在一些显著的差异。本文将深入探讨这两个注解的区别,并结合 Spring 源码进行分析,同时附上源码的执行流程图,帮助您更好地理解它们的工作原理。

一、@Autowired 注解

源码分析

在 Spring 中,@Autowired 的处理主要在 AutowiredAnnotationBeanPostProcessor 类中。当 Spring 容器初始化 bean 时,会遍历 bean 中的属性,如果发现带有 @Autowired 注解的属性,就会尝试从容器中获取对应的 bean 进行注入

代码入口:

public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter {public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) {/*** 根据当前bean 查找出来所有添加了@AutoWired 属性的* 根据属性实例化 一些注入器*/InjectionMetadata metadata = findAutowiringMetadata(beanName, bean.getClass(), pvs);try {metadata.inject(bean, beanName, pvs);}catch (BeanCreationException ex) {throw ex;}catch (Throwable ex) {throw new BeanCreationException(beanName, "Injection of autowired dependencies failed", ex);}return pvs;}
}

执行流程

  1. Spring 容器扫描带有 @Autowired 注解的属性。
  2. 根据属性的类型在容器中查找匹配的 bean。
  3. 如果找到多个相同类型的 bean,再根据属性名称进行匹配。
  4. 将匹配到的 bean 实例注入到目标属性。

二、@Resource 注解

@Resource 是 JSR-250 规范定义的注解,既可以按照名称进行装配,也可以按照类型进行装配。

源码分析

@Resource 的处理在 Spring 的 CommonAnnotationBeanPostProcessor 类中。

代码入口:

public class CommonAnnotationBeanPostProcessor extends InitDestroyAnnotationBeanPostProcessor implements MergedBeanDefinitionPostProcessor {@Overridepublic PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) {/*** 根据当前bean 查找出来所有添加了@Resource 属性的* 根据属性实例化 一些注入器*/InjectionMetadata metadata = findResourceMetadata(beanName, bean.getClass(), pvs);try {metadata.inject(bean, beanName, pvs);}catch (Throwable ex) {throw new BeanCreationException(beanName, "Injection of resource dependencies failed", ex);}return pvs;}
}

执行流程

  1. Spring 容器扫描带有 @Resource注解的属性。
  2. 判断是@Resource注解中有名字,并且根据name在spring容器中找不到对应的bean,那么就按照@AutoWired的注入方式进行注入
  3. 条件2 不成立的话那么就按照名字获取一个bean进行注入
http://www.lryc.cn/news/388321.html

相关文章:

  • Golang-slice理解
  • 【Linux系统】文件描述符fd
  • 【嵌入式——FreeRTOS】启动任务调度器
  • EFCore_客户端评估与服务端评估
  • Java面试题--JVM大厂篇之深入了解G1 GC:高并发、响应时间敏感应用的最佳选择
  • SAP配置发布WebService接口并调用(超级详细)
  • 中英双语介绍美国首都:华盛顿哥伦比亚特区(Washington, D.C.)
  • java:aocache的单实例缓存(一)
  • pcap包常见拆分方法
  • C++中的类型转换操作符:static_cast reinterpret_cast const_cast dynamic_cast
  • MySQL-SQL优化Explain命令以及参数详解
  • 别只会重启了!进来告诉你AP无法上线怎么办
  • 数据恢复篇:如何在 Android 手机上恢复未保存/删除的 Word 文档
  • Python | Leetcode Python题解之第208题实现Trie(前缀树)
  • Ethernet是以太网通讯
  • 咖啡消费旺季到来 为何想转让的库迪联营商却越来越多
  • 神经网络原理
  • 安卓应用开发学习:获取经纬度及地理位置描述信息
  • 各类排序方法 手撕快排 回顾经典快排 优化版快排
  • 独一无二的设计模式——单例模式(Java实现)
  • 使用MoA(Mixture of Agents)混合智能体技术,结合多个开源大语言模型如Llama3、phi-3和Mistral,实现一个强大的AI智能体
  • 前端面试题_Css
  • AI在线免费视频工具3:声音生视频
  • final、const、readonly关键字在不同语言中代表着什么
  • HarmonyOS ArkUi Tabs+TabContent+List实现tab吸顶功能
  • Hugging Face Accelerate 两个后端的故事:FSDP 与 DeepSpeed
  • TextField是用于在用户界面中输入文本的控件。它广泛应用于表单、搜索框、评论区等需要用户输入文字的场景
  • MYSQL 四、mysql进阶 5(InnoDB数据存储结构)
  • Spring企业开发核心框架-下
  • X射线底片焊缝缺陷检测