Spring-bean的生命周期
标准bean生命周期
Bean工厂实现应该尽可能支持标准Bean生命周期接口。整套初始化方法及其标准顺序如下:
BeanNameAware.setBeanName,
BeanClassLoaderAware.setBeanClassLoader,
BeanFactoryAware.setBeanFactory,
org.springframework.context.EnvironmentAware.setEnvironment,
org.springframework.context.EmbeddedValueResolverAware.setEmbeddedValueResolver,
org.springframework.context.ResourceLoaderAware.setResourceLoader,
org.springframework.context.ApplicationEventPublisherAware.setApplicationEventPublisher,org.springframework.context.MessageSourceAware.setMessageSource,
org.springframework.context.ApplicationContextAware.setApplicationContext,
org.springframework.web.context.ServletContextAware.setServletContext,
org.springframework.beans.factory.config.BeanPostProcessor.postProcessBeforeInitialization,
InitializingBean.afterPropertiesSet,
org.springframework.beans.factory.support.RootBeanDefinition.getInitMethodName,
org.springframework.beans.factory.config.BeanPostProcessor.postProcessAfterInitialization,
org.springframework.beans.factory.config.DestructionAwareBeanPostProcessor.postProcessBeforDestruction,
DisposableBean.destroy,
org.springframework.beans.factory.support.RootBeanDefinition.getDestroyMethodName
bean生命周期分析
从ClassPathXmlApplicationContext
的构造函数开始作为入口分析:
整个容器初始化过程大致如图所示:
bean初始化准备工作:
在obtainFreshBeanFactory
方法中先loadBeanDefinitions
加载bean定义,然后创建beanFactory
实例,以及其他一些系统必要组件的加载
开始生命周期
- 如果有则调用
BeanDefinitionRegistryPostProcessor
接口的postProcessBeanDefinitionRegistry
- 如果有则调用
BeanFactoryPostProcessor
的postProcessBeanFactory
方法 - 如果有则调用
InstantiationAwareBeanPostProcessor
接口的postProcessBeforeInstantiation
前置方法
一个使用代理创建bean
的机会,如果返回null,则开始正式创建bean
如果不为null,则调用postProcessAfterInitialization
后置方法 - 实例化bean
- 如果有则调用
MergedBeanDefinitionPostProcessor
的postProcessMergedBeanDefinition
方法 - 填充bean属性
- 开始标准bean的声明周期(
initializeBean(...)
方法里)
xxAware
实现原理
以ApplicationContextAware
为例:
其实还是利用BeanPostProcessor
的能力,关键代码如下:
class ApplicationContextAwareProcessor implements BeanPostProcessor { @Override @Nullable public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if (!(bean instanceof EnvironmentAware || bean instanceof EmbeddedValueResolverAware || bean instanceof ResourceLoaderAware || bean instanceof ApplicationEventPublisherAware || bean instanceof MessageSourceAware || bean instanceof ApplicationContextAware)){ return bean; } AccessControlContext acc = null; if (System.getSecurityManager() != null) { acc = this.applicationContext.getBeanFactory().getAccessControlContext(); } if (acc != null) { AccessController.doPrivileged((PrivilegedAction<Object>) () -> { invokeAwareInterfaces(bean); return null; }, acc); } else { // 通过调用这个方法 invokeAwareInterfaces(bean); } return bean; } private void invokeAwareInterfaces(Object bean) { if (bean instanceof EnvironmentAware) { ((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment()); } if (bean instanceof EmbeddedValueResolverAware) { ((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver); } if (bean instanceof ResourceLoaderAware) { ((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext); } if (bean instanceof ApplicationEventPublisherAware) { ((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext); } if (bean instanceof MessageSourceAware) { ((MessageSourceAware) bean).setMessageSource(this.applicationContext); } if (bean instanceof ApplicationContextAware) { ((ApplicationContextAware) bean).setApplicationContext(this.applicationContext); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律