Spring生命周期
2020-04-27 18:07:53 0 举报
AI智能生成
Spring的生命周期及一些常用的扩展点
作者其他创作
大纲/内容
refresh()
prepareRefresh();
准备上下文的环境
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
告诉子类刷新内部bean工厂
createBeanFactory()
创建Bean工厂
customizeBeanFactory
如果用户自定义了允许Bean定义覆盖和允许循环引用则设置为定义的,
默认为不允许
默认为不允许
loadBeanDefinitions
加载bean,根据上下文不同,会由不同的解析器加载,例如xml,web,注解等
prepareBeanFactory(beanFactory);
这个方法主要是配置BeanFactory的各种类加载器,需要的依赖和需要忽略的依赖,后处理器,解析器等
postProcessBeanFactory(beanFactory);
空实现
允许子类添往bean工厂里添加一下自己的公用bean,像子类的一些包扫描加载的bean
允许子类添往bean工厂里添加一下自己的公用bean,像子类的一些包扫描加载的bean
invokeBeanFactoryPostProcessors(beanFactory);
实现了BeanFactoryPostProcessor的bean会在这步直接初始化,
初始化后后面其他bean实例化时就可以被这个bean"监控到"
初始化后后面其他bean实例化时就可以被这个bean"监控到"
调用之前加载进去beanFactory里面的处理器,可以修改各个注册的Bean或动态注册bean
invokeBeanFactoryPostProcessors
invokeBeanDefinitionRegistryPostProcessors
这个是注册bean了,如果是通过注释启动的容器(配置类),就会通过配置类为起点开始进行各种扫描,各种bean进行注册
postProcessBeanDefinitionRegistry
这里是注释解析器
ConfigurationClassPostProcessor
基本上大部分的基于注解的解析功能都在这里了
ConfigurationClassParser
创建一个配置类解析
ComponentScanAnnotationParser
processConfigBeanDefinitions
parser.parse
这里开始解析@controller,@servcie等等那些注解
processConfigurationClass
processConfigurationClass
BeanDefinitionRegistryPostProcessor
postProcessBeanDefinitionRegistry
可以动态将Bean注册
invokeBeanFactoryPostProcessors
BeanFactoryPostProcessor
postProcessBeanFactory
可以修改各个注册的Bean
通过该接口修改IOC容器里的bean定义,一般用不到
但如果需要修改第三方接口IOC容器的bean定义,这个是最好的接入点
但如果需要修改第三方接口IOC容器的bean定义,这个是最好的接入点
registerBeanPostProcessors(beanFactory);
实现了BeanPostProcessor的bean会在这步直接初始化,
初始化后后面其他bean实例化时就可以被这个bean"监控到"
初始化后后面其他bean实例化时就可以被这个bean"监控到"
initMessageSource();
初始化上下文的消息源。
initApplicationEventMulticaster();
初始化上下文的事件传播器
onRefresh();
在特定上下文子类中初始化其他特殊bean
registerListeners();
检查监听器bean并注册它们
finishBeanFactoryInitialization(beanFactory);
所有初始化工作已经准备完毕,把bean工厂作为参数传入,准备调用bean工厂,实例化bean
DefaultListableBeanFactory
beanFactory.preInstantiateSingletons();
List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
获取所有bean定义
for (String beanName : beanNames) {
一个个实例化
getBean(beanName)
AbstractBeanFactory
doGetBean
getSingleton(
beanName,
singletonFactory)
lamba表达式
beanName,
singletonFactory)
lamba表达式
先尝试从缓存map里取
singletonFactory
AbstractAutowireCapableBeanFactory
createBean
resolveBeforeInstantiation
Give BeanPostProcessors a chance to return a proxy instead of the target bean instance
给一个机会返回一个代理对象
AOP核心
InstantiationAwareBeanPostProcessor
postProcessBeforeInstantiation
doCreateBean
createBeanInstance(beanName, mbd, args);
instantiateBean
调用构造函数实例化
boolean earlySingletonExposure
是否允许提前暴露?
是否单例?
是否创建中?
是否允许循环依赖?
addSingletonFactory
允许提前暴露则把bean存到缓存map中
此时bean的生命周期没有完成,只是实例一个对象到map里,
populateBean
注入工作
InstantiationAwareBeanPostProcessor
扩展点:循环一个个后置处理器
postProcessAfterInstantiation
autowire
自动注入
bean里面的成员如果有@Autoware则解释
InstantiationAwareBeanPostProcessor
扩展点
postProcessPropertyValues
applyPropertyValues
真正注入
initializeBean
初始化
invokeAwareMethods
BeanNameAware
BeanClassLoaderAware
BeanFactoryAware
applyBeanPostProcessorsBeforeInitialization
BeanPostProcessor
postProcessBeforeInitialization
invokeInitMethods
InitializingBean
afterPropertiesSet
invokeCustomInitMethod
init
自定义初始方法
applyBeanPostProcessorsAfterInitialization
BeanPostProcessor
postProcessAfterInitialization
DisposableBean
注册销毁接口
DisposableBean
destroy
对象销毁时会调用
myDestory
自定义销毁方法
先执行DisposableBean再执行myDestory
addSingleton(beanName, singletonObject);
创建成功,加入缓存
SmartInitializingSingleton
afterSingletonsInstantiated
所有bean初始化完成后,触发
finishRefresh();
initLifecycleProcessor()
初始化属于bean自己的生命周期
LifecycleProcessor
如果没有,IOC默认创造一个DefaultLifecycleProcessor管理全部实现了LifecycleProcessor的类
getLifecycleProcessor().onRefresh();
DefaultLifecycleProcessor
对实现了Lifecycle的接口的bean开始属于它自己的生命周期,eureka
onRefresh
Lifecycle
start()
stop()
publishEvent(new ContextRefreshedEvent(this));
0 条评论
下一页