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

做外贸哪个网站看外汇百度号码认证

做外贸哪个网站看外汇,百度号码认证,涿鹿县建设局网站,建盏大师排名与落款Autowired 是 Spring 中最常用的依赖注入注解之一,它的底层实现涉及多个核心组件和机制。理解其源码实现有助于深入掌握 Spring 的 依赖注入(DI) 原理。 🧠 一、Autowired 的作用 ✅ 功能概述: 自动装配 Bean支持字段…

@Autowired 是 Spring 中最常用的依赖注入注解之一,它的底层实现涉及多个核心组件和机制。理解其源码实现有助于深入掌握 Spring 的 依赖注入(DI) 原理。


🧠 一、@Autowired 的作用

✅ 功能概述:

  • 自动装配 Bean
  • 支持字段注入、构造器注入、Setter 注入
  • 支持按类型匹配(默认)、结合 @Qualifier 按名称匹配

✅ 示例使用方式:

@Component
class A {@Autowiredprivate B b;
}@Component
class B {}

🔄 二、@Autowired 的工作原理与流程

Spring 在创建 Bean 的过程中会解析 @Autowired 注解,并自动注入依赖对象。整个过程主要由以下组件协作完成:

类名职责
AutowiredAnnotationBeanPostProcessor处理 @Autowired@Value 等注解
DefaultListableBeanFactory.resolveDependency()解析依赖项(按类型查找匹配的 Bean)
InjectionMetadata存储要注入的字段或方法信息
BeanWrapperImpl实际进行属性赋值

🔍 三、关键源码分析

📁 核心类路径:

  • org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor
  • org.springframework.beans.factory.annotation.InjectionMetadata
  • org.springframework.beans.factory.support.DefaultListableBeanFactory

1️⃣ AutowiredAnnotationBeanPostProcessor:主处理器

这个类是 BeanPostProcessor 的一个实现,负责在 Bean 创建前后处理 @Autowired 注解。

关键方法:
public class AutowiredAnnotationBeanPostProcessor implements MergedBeanDefinitionPostProcessor {// 找出类中所有带有 @Autowired 的字段/方法@Overridepublic void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {InjectionMetadata metadata = findAutowiringMetadata(beanName, beanType, null);metadata.checkConfigMembers(beanDefinition);}// 在 Bean 初始化之前注入依赖@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) {try {InjectionMetadata metadata = findAutowiringMetadata(beanName, bean.getClass(), bean);metadata.inject(bean, beanName, null); // 执行注入} catch (Throwable ex) {throw new BeanCreationException(beanName, "Injection of autowired dependencies failed", ex);}return bean;}
}

2️⃣ InjectionMetadata:存储注入元数据

该类封装了需要注入的字段或方法信息。

private InjectionMetadata(Class<?> targetClass, Collection<InjectedElement> elements) {this.targetClass = targetClass;this.injectedElements = elements;
}public void inject(Object target, @Nullable String beanName, @Nullable PropertyValues pvs) throws Throwable {for (InjectedElement element : this.injectedElements) {element.inject(target, beanName, pvs); // 对每个字段执行注入}
}

3️⃣ AutowiredFieldElement:字段注入逻辑

针对字段注入的情况,Spring 使用 AutowiredFieldElement 来处理。

private class AutowiredFieldElement extends InjectionMetadata.InjectedElement {@Overrideprotected void inject(Object bean, String beanName, PropertyValues pvs) throws Throwable {Field field = getField();Object value = resolveFieldValue(field, bean, beanName); // 解析值if (value != null) {ReflectionUtils.makeAccessible(field);field.set(bean, value); // 使用反射设置字段值}}private Object resolveFieldValue(Field field, Object bean, String beanName) {DependencyDescriptor descriptor = new DependencyDescriptor(field, true);return getBeanFactory().resolveDependency(descriptor, beanName); // 解析依赖}
}

4️⃣ DefaultListableBeanFactory.resolveDependency():解析依赖

这是 Spring 依赖注入的核心方法,用于根据类型查找并返回合适的 Bean。

public Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName) {// 获取目标类型Class<?> typeToMatch = descriptor.getDependencyType();// 查找所有匹配的 Bean 名称String[] candidateNames = getBeanNamesForType(typeToMatch);if (candidateNames.length == 1) {// 如果只有一个匹配项,直接返回return getBean(candidateNames[0]);} else if (candidateNames.length > 1) {// 如果有多个匹配项,尝试结合 @Qualifier 进行筛选Map<String, Object> candidates = new LinkedHashMap<>(candidateNames.length);for (String candidateName : candidateNames) {if (!isSelfReference(requestingBeanName, candidateName, descriptor)) {candidates.put(candidateName, getBean(candidateName));}}// 使用 Qualifier 或 Primary 来决定最终选择哪个 Beanreturn determinePrimaryCandidate(candidates, descriptor);} else {// 没有找到匹配的 Beanreturn null;}
}

⚙️ 四、@Autowired 注入的关键机制

1. 依赖查找机制

  • Spring 通过 getBeanNamesForType() 方法查找容器中所有符合指定类型的 Bean。
  • 支持泛型注入(如 List<A>Map<String, A>

2. 多实例匹配问题

当有多个相同类型的 Bean 时,可以通过以下方式解决冲突:

  • @Primary:标记首选 Bean
  • @Qualifier("beanName"):指定具体 Bean 名称
  • 结合自定义限定符注解(如 @MyQualifier

3. 注入时机

  • 字段注入发生在 postProcessBeforeInitialization() 阶段
  • 构造器注入则在 Bean 实例化阶段就完成(通过 autowireConstructor()

🧱 五、支持的注入方式对比

注入方式是否支持说明
字段注入最常用,但不推荐用于生产代码(破坏封装)
Setter 注入推荐用于可选依赖
构造器注入推荐用于强制依赖,不可变对象更安全
方法注入(任意方法)@Autowired public void init(A a)

❓六、常见问题 & 面试题(结合源码)

Q1: @Autowired 是如何实现的?

Spring 使用 AutowiredAnnotationBeanPostProcessor 在 Bean 初始化前扫描类中的 @Autowired 注解,然后通过反射注入对应的依赖对象。

Q2: @Autowired@Resource 有什么区别?

特性@Autowired@Resource
来源SpringJDK(JSR-250)
默认行为按类型注入按名称注入
是否支持 required=false
是否支持 JSR-330 (@Inject)

Q3: 多个同类型 Bean 如何注入?

Spring 会抛出异常(NoUniqueBeanDefinitionException),可通过 @Primary@Qualifier 明确指定注入哪一个 Bean。

Q4: @Autowired 可以用在哪些地方?

支持字段、构造器、Setter、任意方法上,甚至可以用于 ListMap、数组等集合类型。


✅ 总结

特性Spring @Autowired 实现
注解处理器AutowiredAnnotationBeanPostProcessor
注入元数据InjectionMetadata
字段注入AutowiredFieldElement
构造器注入autowireConstructor()
依赖解析resolveDependency()
多 Bean 冲突支持 @Primary, @Qualifier 解决
注入时机postProcessBeforeInitialization() 阶段
http://www.dtcms.com/wzjs/784539.html

相关文章:

  • 网站空间不支持php5.4国家重点学科建设网站
  • 济宁网站建设软件开发网站兼容哪些浏览器
  • 彩票网站开发 违法保定知名网站建设公司
  • 长沙学做网站建设邯郸网站设计公司排名
  • 做淘客需要网站广州seo网站排名
  • 网站开发客户提供素材360建筑网官网下载
  • 网站快照诊断个人可以做哪些有意思的网站
  • 校园网站推广方案怎么做简单网站html模板下载地址
  • 太原做网站公司哪家好网站制作类软件推荐
  • 中小企业网站建设论文山东省济南市莱芜区
  • 给赌场做网站设计公司上市企业
  • 中山视角做网站的公司dw如何在网站做弹窗
  • 淘宝美工与网站开发网站建设 阿里巴巴旗下
  • 企业对比网站做网站需要写配置文件吗
  • 建设银行签名通在网站哪里下载wordpress 用户权限
  • 中国城乡建设部官方网站app 设计网站建设
  • 设计规范网站东莞东城招聘网最新招聘
  • 有做游戏广告的网站制作wordpress文章模板
  • 网站建设包括哪些内容退役厅网站建设中标公告
  • server 2012 iis 添加网站微商城登录
  • 长沙网站搭建gate网站合约怎么做空
  • 泉州市住房与城乡建设局网站贴吧aso优化贴吧
  • 计算机网站的开发流程工作汇报总结怎么写
  • 网站 网站 建设做网站被骗首付款怎么报案
  • 服务器在国外怎样做网站镜像阿里 网站建设
  • 帮人做非法网站贸易公司网站建设价格
  • 自己怎么做交易网站网站定位方案
  • 成都网站建设前十网站建设参数
  • 云南建设工程招标网站客户关系管理系统软件
  • 杭州企业建设网站公司wordpress单栏极简