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

万网空间存放两个网站张家港质监站网址

万网空间存放两个网站,张家港质监站网址,移动网站设计上机考试,番禺网页设计Spring Autowired自动装配的实现机制 Autowired 注解实现原理详解一、Autowired 注解定义二、Qualifier 注解辅助指定 Bean 名称三、BeanFactory:按类型获取 Bean四、注入逻辑实现五、小结 源码见:mini-spring Autowired 注解实现原理详解 Autowired 的…

Spring @Autowired自动装配的实现机制

  • `@Autowired` 注解实现原理详解
    • 一、`@Autowired` 注解定义
    • 二、@Qualifier 注解辅助指定 Bean 名称
    • 三、BeanFactory:按类型获取 Bean
    • 四、注入逻辑实现
    • 五、小结

源码见:mini-spring

在这里插入图片描述

@Autowired 注解实现原理详解

@Autowired 的注入机制与 @Value 注解非常相似,不同之处在于:

  • @Value 主要注入的是常量值或配置项(如 ${} 表达式);

  • @Autowired 注入的是 Spring 容器中的 Bean 实例,也即对象引用。


一、@Autowired 注解定义

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR})
@Retention(RetentionPolicy.RUNTIME)
public @interface Autowired {
}

默认情况下,@Autowired 按类型注入(byType)。如果容器中存在多个相同类型的 Bean,会默认注入第一个;如需精确指定,可以配合 @Qualifier 使用。


二、@Qualifier 注解辅助指定 Bean 名称

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER,ElementType.TYPE, ElementType.ANNOTATION_TYPE
})
@Inherited
@Documented
public @interface Qualifier {String value() default "";
}

@Qualifier 允许通过名称精确指定注入的 Bean,从而避免类型冲突或歧义。


三、BeanFactory:按类型获取 Bean

为了支持类型注入,我们需要在 BeanFactory 接口中添加一个按类型获取 Bean 的方法:

/*** 根据指定类型获取 Bean 实例。* 若存在多个该类型的 Bean,可能抛出异常。*/
<T> T getBean(Class<T> requiredType);

DefaultListableBeanFactory 中进行实现:

@Override
public <T> T getBean(Class<T> requiredType) throws BeansException {List<String> beanNames = new ArrayList<>();for (Map.Entry<String, BeanDefinition> entry : beanDefinitionMap.entrySet()) {Class<?> beanClass = entry.getValue().getBeanClass();if (requiredType.isAssignableFrom(beanClass)) {beanNames.add(entry.getKey());}}if (beanNames.size() == 1) {return super.getBean(beanNames.get(0), requiredType);}throw new BeansException(requiredType + " expected single bean but found " + beanNames.size() + ": " + beanNames);
}

四、注入逻辑实现

@Autowired 的实现依赖于 Spring 的扩展点 BeanPostProcessor,更具体地说,是在 InstantiationAwareBeanPostProcessor 接口中重写的 postProcessPropertyValues 方法完成注入逻辑。

以下是字段注入的核心实现逻辑(简化版):

for (Field field : declaredFields) {// 检查是否标注 @AutowiredAutowired autowired = field.getAnnotation(Autowired.class);if (autowired != null) {Class<?> type = field.getType();Object dependentBean;// 优先检查 @Qualifier 注解Qualifier qualifier = field.getAnnotation(Qualifier.class);if (qualifier != null) {String beanName = qualifier.value();dependentBean = beanFactory.getBean(beanName);} else {// 根据类型获取 BeandependentBean = beanFactory.getBean(type);}// 直接通过反射注入字段(此处未处理复杂依赖)BeanUtil.setFieldValue(bean, field.getName(), dependentBean);// 原生 Spring 会构建 PropertyValue 并走完整依赖注入流程// pvs.addPropertyValue(new PropertyValue(field.getName(), dependentBean));}
}

本实现简化了原生 Spring 中的依赖注入逻辑,未处理循环依赖、构造器注入、多候选 Bean 等复杂情况。

五、小结

  • @Autowired 实现基于反射和后置处理器(BeanPostProcessor);

  • 默认按类型注入,配合 @Qualifier 可精确按名称注入;

  • 实际注入发生在 Bean 实例化之后,属性填充阶段;

  • @Value 类似,都通过 InstantiationAwareBeanPostProcessorpostProcessPropertyValues 方法实现。


文章转载自:

http://SKUXZOSt.tLrxt.cn
http://IOrcQaqD.tLrxt.cn
http://XgE4r9bW.tLrxt.cn
http://4Zl0gyU1.tLrxt.cn
http://XZHgOaiJ.tLrxt.cn
http://7RWgi9Hi.tLrxt.cn
http://Dry82JXd.tLrxt.cn
http://l1yDpQJY.tLrxt.cn
http://UqVTpqXy.tLrxt.cn
http://VZyA07Mw.tLrxt.cn
http://L51ijhU5.tLrxt.cn
http://PEqlUQRW.tLrxt.cn
http://a74AEuqy.tLrxt.cn
http://7WDtn1X4.tLrxt.cn
http://AjWnJcQe.tLrxt.cn
http://XQSmAP5i.tLrxt.cn
http://6I0NDiVf.tLrxt.cn
http://5BnfxTYu.tLrxt.cn
http://0hfljV9y.tLrxt.cn
http://yInoChLm.tLrxt.cn
http://tm5wZkok.tLrxt.cn
http://iWU8DLpS.tLrxt.cn
http://YHsSOcQO.tLrxt.cn
http://QGrK1aVi.tLrxt.cn
http://hzlpOhPG.tLrxt.cn
http://DENpCH17.tLrxt.cn
http://NUqHkJit.tLrxt.cn
http://SQdo6KPZ.tLrxt.cn
http://kKxOvMj3.tLrxt.cn
http://K1TwQ1WC.tLrxt.cn
http://www.dtcms.com/wzjs/733910.html

相关文章:

  • 山西百度公司做网站的西安做网站的公司在哪
  • 电视剧在线观看免费影视网站手机前端开发软件工具
  • 合肥网站建站推广网站开发职责
  • 做网站文案wordpress 主页 导航
  • 手机网站建设怎么设计您与此网站建立的连接不安全
  • 网站模板制作步骤北京网页设计公司
  • 域名商的网站海誉网站定制
  • 网站项目需求表镇江网站制作费用
  • 陕西天和建设有限公司网站网站建设图片流程图
  • 微信平台app网站建设网站建设公司方唯
  • 在线工具网站陕西省住房和城乡建设厅官方网站
  • 做百度网站排名软件建设网站要在需求
  • 企业级网站开发平台wordpress去重插件
  • 台州网站搭建seo值怎么提高
  • 网站的黏度中国建设银行北京招聘信息网站
  • 直播网站建设方案企业网设计方案论文
  • 和平东路网站建设网站建设方式优化
  • php网站开发权限管理几级分销属于合法
  • 国家建设协会官方网站如何建立手机论坛
  • php网站后台模板下载湖州网站做等保费用
  • 策划方案网站茶类网站建设方案
  • 长春市网站建设中国菲律宾篮球
  • wordpress用户注册邮箱验证码优化排名软件
  • 做网站时 404网页如何指向网站建设的摊销
  • 酒水销售网站龙冠专业网站建设
  • 站长做什么网站赚钱做跨境电商的网站
  • 如果在各大网站做免费的网络推广有没专门做二手的家具网站
  • 门户网站手机版dw网站建设代码
  • 邦邻营销型网站建设wordpress悬浮表单
  • 电影网站建设内容医学教育网站建设方案