怎样做网站标题的图标,东莞市建设监督网站,网站服务器租赁,京东商城网上购物官网在 Spring 框架中#xff0c;Autowired 和 Resource 是两个常用的注解#xff0c;用于实现依赖注入。尽管它们都能达到将依赖对象注入到目标 bean 的目的#xff0c;但在细节上存在一些显著的差异。本文将深入探讨这两个注解的区别#xff0c;并结合 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;}
}
执行流程
Spring 容器扫描带有 Autowired 注解的属性。根据属性的类型在容器中查找匹配的 bean。如果找到多个相同类型的 bean再根据属性名称进行匹配。将匹配到的 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;}
}
执行流程
Spring 容器扫描带有 Resource注解的属性。判断是Resource注解中有名字并且根据name在spring容器中找不到对应的bean那么就按照AutoWired的注入方式进行注入条件2 不成立的话那么就按照名字获取一个bean进行注入