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

Bean生命周期

BeanPostProcessor的使用

1、Bean的后置处理器,用于初始化前后进行调用,某个Bean去初始化的时候,会自动扫描所有的BeanPostProcessor,然后去执行下面的方法
2、自定义某个后置处理器,去实现接口BeanPostProcess,然后重写里面的方法
(1)public Object postProcessorBeforeInitialization(Object bean,String beanName):
(2)public Object postProcessorAfterInitialization(Object bean,String beanName):

BeanPostProcessor的原理

1、大体过程
(1)创建IOC容器,AnnotationConfigApplicationContext的构造器里面调用refresh()方法,然后调用finishBeanFactoryInitialization()方法,初始化所有的单实例对象
(2)在finishBeanFactoryInitialization()的方法里面,会进行createBean(),然后再调用doCreateBean(),代码里面先会给属性赋值,调用方法populateBean()进行属性赋值,才会执行下面的代码initializeBean()方法
(3)initializeBean()是真正的初始化的方法,里面有后置处理器逻辑,首先执行后置处理器的Before方法,然后执行invokeInitMethods(),这个方法是真正执行初始化的方法,比如Bean指定init-methods方法、实现接口InitializingBean等
(4)在执行invokeInitMethods()方法之前,是后置处理器的before处理逻辑,也就是applyBeanPostProcessorsBeforeInitialization(),方法之后是执行applyBeanPostProcessorsAfterInitialization()
(5)applyBeanPostProcessorsBeforeInitialization():获取到所有的BeanPostProcessor,挨个执行beforeInitialization(),一旦返回null,就跳出for循环,不会执行后面的BeanPostProcessor
(6)applyBeanPostProcessorsAfterInitialization():获取到所有的BeanPostProcessor,挨个执行afterInitialization(),一旦返回null,就跳出for循环,不会执行后面的BeanPostProcessor

Spring底层对BeanPostProcessor的使用

1、一个Bean中注入IOC容器
(1)这个Bean去实现接口ApplicationContextAware接口,重写里面的setApplicationContext()方法,在Bean里面创建一个变量,去接收ApplicationContextAwareProcessor设置的IOC容器
(2)ApplicationContextAwareProcessor这个是实现了BeanPostProcessor接口的类,里面的postProcessorBeforeInitialization(Object bean,String beanName),会进行判断这个Bean有没有实现相应的Aware接口,然后才会set一个IOC容器
2、Bean里面注解的原理(以@BeanConstruct和@PreDestroy)
(1)Spring里面有一个BeanPostProcessor是专门管理声明周期注解的,叫InitDestroyAnnotationBeanPostProcessor,里面postProcessorBeforeInitialization(Object bean,String beanName)方法会调用findLifecycleMetadata()方法,里面有相关的注解标注的方法,通过反射的方式去调用相应的方法
3、总结
(1)Bean的赋值,其他组件的注入,@Autowired,生命周期注解功能,@Async等等,都是依靠BeanPostProcessor弄成的

http://www.hskmm.com/?act=detail&tid=24500

相关文章:

  • 回忆QQ空间有感
  • mtgsig
  • 前端学习教程-Vue Router 教程
  • 详细介绍:Java-Spring 入门指南(十七)SpringMVC--Apipostl与RestFul实战测试
  • 详细介绍:告别 403 Forbidden!详解爬虫如何模拟浏览器头部(User-Agent)
  • 通过学习分位数函数提升预测准确性
  • 高中数列梳理
  • AtCoder Beginner Contest 426 实况记录 + A-D 题解
  • 提示词攻击如何防范(2025):从 Indirect Prompt Injection 到 RAG 供应链的分层防御实战
  • 【STM32项目开源】基于STM32的智能养殖场环境监测系统 - 详解
  • 前端学习教程-Axios
  • 『回忆录』返校前夜 230102
  • 断更
  • 前端学习教程-环境配置
  • TypeScript - Ref
  • 20251004 qmd 弱化规约(未完成)
  • 深入解析:人工智能专业术语详解(C)
  • 2025.10.4模拟赛
  • 黄金替罪羊
  • P5301 [GXOI/GZOI2019] 宝牌一大堆
  • 10.4 2025多校冲刺CSP模拟赛2 改题记录
  • 【比赛记录】2025CSP-S模拟赛58
  • 回忆有感
  • 框架高效的系统的演进如何塑造人工智能的深层语义分析能力
  • 『回忆录』高二上第一次月考——压力下的崛起,意料外的突破
  • AutoCAD 2025安装包下载 CAD免费下载 永久免费激活 附详细安装教程
  • 微分和积分的区别
  • 202509_QQ_secret
  • 4 对拍杂谈
  • Matlab R2024b下载及详细安装教程,附永久免费Matlab安装包