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

AutowiredAnnotationBeanPostProcessor执行原理分析

        之前介绍了Bean后处理器的使用,那@AutoWired注解是如何生效?

1.准备Bean

package com.example.demo2.b02;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/2 23:06*/
public class Bean1 {private static final Logger log = LoggerFactory.getLogger(Bean1.class);private Bean2 bean2;@Autowiredpublic void setBean2(Bean2 bean2){log.info("Autowired生效 :{}",bean2);this.bean2 = bean2;}private Bean3 bean3;@Resourcepublic void setBean3(Bean3 bean3){log.info("@Resource生效 :{}",bean3);this.bean3 = bean3;}private String home;@Autowiredpublic void setHome(@Value("${JAVA_HOME}") String home){this.home = home;log.info("@Value生效: {}",home);}@PostConstructpublic void init(){log.info("@PostConstruct 生效");}@PreDestroypublic void destroy(){log.info("@PreDestroy 生效");}@Overridepublic String toString() {return "Bean1{" +"bean2=" + bean2 +", bean3=" + bean3 +", home='" + home + '\'' +'}';}
}
package com.example.demo2.b02;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/2 23:08*/
public class Bean2 {
}
package com.example.demo2.b02;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/2 23:08*/
public class Bean3 {
}

2.执行过程分析

package com.example.demo2.b02;import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.annotation.ContextAnnotationAutowireCandidateResolver;
import org.springframework.core.env.StandardEnvironment;/*** @author zhou* @version 1.0* @description TODO* @date 2025/10/4 21:24*/
public class TestDigInAutowired {public static void main(String[] args) {DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();beanFactory.registerSingleton("bean2",new Bean2());beanFactory.registerSingleton("bean3",new Bean3());beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());//解析@valuebeanFactory.addEmbeddedValueResolver(new StandardEnvironment()::resolvePlaceholders);//解析${}的解析器//1.查找哪些属性加了@AutowiredAutowiredAnnotationBeanPostProcessor processor = new AutowiredAnnotationBeanPostProcessor();processor.setBeanFactory(beanFactory);Bean1 bean1 = new Bean1();System.out.println(bean1);processor.postProcessProperties(null,bean1,"bean1"); //执行依赖注入 @Autowired @ValueSystem.out.println(bean1);}
}

1)创建BeanFactory

    注入Bean1和Bean2,并且设置@Value注解解析器以及${}的解析器。

2)创建后处理器

 AutowiredAnnotationBeanPostProcessor processor = new AutowiredAnnotationBeanPostProcessor();

3)postProcessProperties方法使用

 processor.postProcessProperties(null,bean1,"bean1");

    主要是通过上面方法查找加了@Autowired注解的属性并进行依赖注入。

 结果:

        继续看源码里面是如何实现的,先使用了下面方法查找@Autowired注解。

findAutowiringMetadata(beanName, bean.getClass(), pvs)

        并使用下面方法进行了注入。

 metadata.inject(bean, beanName, pvs);

4)findAutowiringMetadata方法

     该方法主要用来查找加了@Autowired注解的属性并封装成元数据。

5)Inject方法注入

http://www.dtcms.com/a/443382.html

相关文章:

  • 易营宝智能建站免费推广网站
  • html做游戏网站昆明网站设计报价
  • 国科信息学薪火计划模拟赛Round2题解
  • 一文讲通JS普通函数与箭头函数的区别
  • 如何学好电脑维修,想学电脑维修技术去哪里学?
  • 4s店网站建设计划手机微网站平台登录入口
  • [Linux基础——Lesson11.Shell运行原理 (王婆传媒) ]
  • 网站开发工程师任职要求设计app界面的软件
  • 网站更换域名 换程序 SEO沧州做网站的大公司
  • 网站建设与管理教学计划企信网是干什么的
  • 苍溪县建设局网站天元建设集团有限公司是什么性质
  • 企业网站建设与实施调查报告有什么好字体可以导入wordpress
  • seo工作流程图优化建站
  • algorithm <B> data access in array 2/99
  • Kubernetes网络核心:CNI超简指南
  • 株洲公司网站建设推广运营公司哪家好
  • 有口碑的盐城网站建设如何注册公司并获得营业执照
  • 陕西省交通建设集团公司招聘网站wordpress justnews下载
  • 构建AI智能体:五十三、反应式应急+深思式优化:反应速度与规划智慧的平衡
  • 园区门户网站建设wordpress装ssl
  • 商城网站建设可以吗wordpress付费访问页面
  • Podman容器开机自启
  • 邢台哪儿做wap网站好淮北论坛最新招聘信息
  • 郑州天梯网站制作嘉定制作企业网站
  • 集约化网站建设的函网站开发软件中文版
  • 怎么做网站外推ppp模式在网站建设的
  • 【数据结构】非线性数据结构——堆
  • 河西区做网站的公司网站维护中要多久才能重新进入
  • 怎么让谷歌收录我的网站博客网站怎么建设
  • 网站收录查询邯郸网站优化平台