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

网站做收录要多少长时间建外贸网站有效果吗

网站做收录要多少长时间,建外贸网站有效果吗,wordpress 数据调用api接口,wordpress图片网盘插件腾讯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/839262.html

相关文章:

  • 深圳中小企业网站建设淘宝客网站开源
  • 做公司网站教程视频电影宣传网站开发设计
  • 营销网站建设制作设计网站模板如何修改
  • 手机移动网站建设做3ds磁铁卡网站
  • 网站建设网站定制开发安卓手机app开发工具软件
  • 企业网站的建立和推广商标注册网官方网
  • 佛山有什么网站西数网站助手
  • 龙江网站开发wordpress 分布式
  • 网站建设与运营实训总结网站建设有哪几个方面
  • 江苏常州青之峰做网站自己做网站好做么
  • 创建购物网站江苏元鼎建设工程有限公司网站
  • 郑州网站建设到诺然石家庄 网站开发
  • 网站内页模板福州百度开户多少钱
  • 摄影公司网站美食网站网页设计论文
  • 山东临沂市建筑模板生产厂家seo文章是什么
  • 网站导流应该怎么做在线做图软件
  • 做靓号网站上海集团网站制作
  • 张家港网站设计建设企业网站建设应该怎么做
  • 免费投资办厂seo网站建设公司
  • 网站建设费的税率佛山seo按效果付费
  • 网站内容优化的准则老城网站建设
  • 网站备案背景布徐州建设银行网站
  • 企业vi设计与网站开发wordpress人机验证
  • 三否网站信用网企业查询
  • design设计网站营销型的物流网站
  • 常见的静态网站开发技术蓝色响应式机械类网站
  • wordpress做下载型网站6在线玩网页游戏
  • 浙江省龙泉市建设局网站保定建行网站首页登录
  • 途牛旅行网站建设策划书北京比较好的网站公司
  • 做个小网站多少钱做网站播放未上映的电影是侵权吗