SpringBean的生命周期

简介: SpringBean的生命周期

Spring Bean Lifecycle

1 过程

1)调用无参构造


2)执行 set 方法设置属性


也可以是 @Bean 注解方法内容


3)调用 BeanNameAware 的 setBeanName 方法


可以获得 Bean 的名字


4)调用 BeanClassLoaderAware 的 setBeanClassLoader 方法


可以获得 ClassLoader 对象的实例


5)调用 BeanFactoryAware 的 setBeanFactory 方法


可以获得 BeanFactory,主要用来检测作用域


6)调用 EnvironmentAware 的 setEnviroment 方法


可以获得当前环境下所有配置解析


7)调用 EmbeddedValueResolverAware 的 setEmbeddedValueResolver 方法


设置配置解析器


8)调用 ResourceLoaderAware 的 setResourceLoader 方法


可以获得当前加载的所有资源文件


9)调用 ApplicationEventPublisherAware 的 setApplicationEventPublisher 方法


可以获得所有上下文的发布事件


10)调用 MessageSourceAware 的 setMessageSource 方法


处理 MessageSource 类型的 Bean


11)调用 ApplicationContextAware 的 setApplicationContext 方法


可以获得上下文对象,主要获取所有 Bean的名字


12)调用 ServletContextAware 的 setServletContext 方法


实现该方法,可以使用 ServletContext 来执行自己想要的操作。


13)执行 BeanPostProcessor 的 postProcessBeforeInitialization 方法


在每一个 Bean 初始化之前执行的方法(有多少 Bean 调用多少次)


14)执行标注 @PostConstruct 注解的方法


一般标注在 init 方法上,表示初始化方法)


15)执行 InitializingBean 的 afterPropertiesSet 方法


在『当前 Bean 』的属性设置之后才会进行调用(设置 Bean 的属性包括:@Value,@Resource 等)


某个 Bean 的 afterPropertiesSet 方法执行完毕,才会执行下一个 Bean 的 afterPropertiesSet 方法,依据实例化顺序来算。


16)执行配置的 init-method


配置指定的初始化方法


底层使用反射实现


17)执行 BeanPostProcessor 的 postProcessAfterInitialization 方法


在所有 Bean 初始化之后执行的方法(有多少 Bean 调用多少次)


2 额外注意

SmartInitializingSingleton

所有非lazy单例 Bean 加载完成后的回调方法,不是初始化完成,而是加载完成


ApplicationListener

最后调用 onApplicationEvent方法,因为 onApplicationEvent 会被频繁执行,基于观察者模式,需要使用它监听,必须要考虑性能问题。每当在一个 ApplicationEvent 发布到 ApplicationContext 时,这个 Bean 会到通知。 作者:沉默的反补 https://www.bilibili.com/read/cv5926940/ 出处:bilibili


相关文章
|
SQL 分布式计算 监控
Hive性能优化之计算Job执行优化 2
Hive性能优化之计算Job执行优化
339 1
|
Prometheus Cloud Native Java
微服务框架(二十三)Prometheus + Grafana 安装、配置及使用
此系列文章将会描述Java框架Spring Boot、服务治理框架Dubbo、应用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等开源框架,其中穿插着Spring Boot中日志切面等技术的实现,然后通过gitlab-CI以持续集成为Docker镜像。 本文为Prometheus + Grafana 安装、配置及使用 本系列文章中所使用的框架版本为Spring ...
|
JavaScript NoSQL MongoDB
100 # mongoose 的使用
100 # mongoose 的使用
103 0
|
9月前
|
编解码 前端开发 搜索推荐
如何建立自己的体育直播平台-源码搭建全流程
随着在线观看体育赛事用户的爆发式增长,搭建专业体育直播应用成为趋势。利用如熊猫比分的全链路解决方案,创业者可快速启动平台。主要步骤包括前期技术准备(赛事API接口、服务器配置、域名选择、短信服务、云直播服务)、定制化(LOGO标识、功能测试与优化)及正式上线与运营(推广、持续更新、主播入驻)。此方案使创业者能高效进入体育市场,抓住机遇。
|
12月前
|
存储 开发工具 Android开发
使用.NET MAUI开发第一个安卓APP
【9月更文挑战第24天】使用.NET MAUI开发首个安卓APP需完成以下步骤:首先,安装Visual Studio 2022并勾选“.NET Multi-platform App UI development”工作负载;接着,安装Android SDK。然后,创建新项目时选择“.NET Multi-platform App (MAUI)”模板,并仅针对Android平台进行配置。了解项目结构,包括`.csproj`配置文件、`Properties`配置文件夹、平台特定代码及共享代码等。
940 2
|
SQL 数据处理 数据库
|
存储 Ubuntu 安全
在Ubuntu 16.04上安装和配置Nextcloud的方法
在Ubuntu 16.04上安装和配置Nextcloud的方法
279 0
|
算法
Qt 中实现异步散列器
【9月更文挑战第9天】在Qt中,`QCryptographicHash`类可用于实现异步散列计算。首先,在所需文件中引入相关头文件,接着定义一个槽函数处理散列计算完成后的结果。然后,在主函数中创建`QCryptographicHash`对象并指定算法(如SHA256),添加待计算数据并通过`QMetaObject::invokeMethod`异步启动计算。完成后触发`hashCalculated`信号并调用槽函数处理结果。可根据需求选择不同算法并进行错误处理。
101 9
|
Java Apache
Java写CSV文件的正确姿势
Java写CSV文件的正确姿势
1418 0
|
前端开发
36【WinForm】WinForm实现日期计算和日期提醒器
计算当前日期距离今天之前某个日期之间的时间差。
195 0