我结合Spring来讲下Bean的生命周期,整体分为创建、初始化、使用、销毁这几大块,步骤顺序是固定的。 第一步是实例化,Spring根据BeanDefinition调用构造器创建出对象,此时对象属性都还是空值。 第二步进行属性填充,完成依赖注入,像@Autowired自动装配就在这一步执行,给各个属性赋值。 第三步执行Aware接口回调,如果类实现了BeanNameAware、ApplicationContextAware这些接口,容器会把bean名称、上下文等资源注入进来。 第四步是初始化,顺序不能乱:先执行BeanPostProcessor的前置方法,接着依次执行@PostConstruct注解、InitializingBean的afterPropertiesSet方法、配置指定的init-method;全部完成后执行BeanPostProcessor后置方法,我们常用的AOP代理就是在这里生成的。 走完上面流程,Bean就准备好了,我们可以正常从容器获取使用。 最后是销毁阶段,只有单例Bean会由容器管理销毁,容器关闭时触发,执行顺序为@PreDestroy、DisposableBean的destroy方法、配置的destroy-method。多例Bean容器不会管控销毁,需要我们自己手动处理。 额外补充两点,单例Bean默认容器启动时就创建完整生命周期;多例每次获取才实例化,容器不负责销毁。后置处理器是全局钩子,能统一干预所有Bean。
相关推荐
橙橙笔记7 小时前
QT的安装不是光头 强7 小时前
Java 后端 AI 技术选型与学习路线格林威7 小时前
C#图像像素放大:邻域平均、双线性插值实现像素放大的C#实现代码兔兔兔兔17 小时前
记录C++ 8paopaokaka_luck8 小时前
基于springboot3+vue3的文山民族文化资源展示与推广平台(协同过滤算法、Echarts 图形化分析)eralong8 小时前
Java IO 与 NIOJesse_EC8 小时前
我给消息推送加了 Publisher Confirm,然后亲手引入了一个竞态名字还没想好☜8 小时前
Go 1.23 range-over-func 迭代器实战:自定义可迭代类型、提前退出与惰性求值S3rein8 小时前
JAVA多线程手撕用户8181870627468 小时前
第7章 死锁排查实录:jstack定位死锁的完整流程