Spring 执行流程
2021-01-29 14:44:11 0 举报
Spring Bean的声明周期,Spring的执行流程
作者其他创作
大纲/内容
调用初始化方法:
postProcessBeanDefinitionRegistry
获取BeanFactory
null
initLifecycleProcessor();初始化生命周期处有关后置理器
注册Bean后置处理器,拦截Bean创建过程。
发布相应的事件
onRefresh();
类型转换功能
有
通常都为null
执行BeanFactory后置处理
是否为单例
执行后置处理器 实现 MergedBeanDefinitionPostProcessor
否
beanFactory.preInstantiateSingletons();(实例化所有的单例Bean)
获取当前Bean依赖的所有Bean
触发所有适用bean的初始化后回调...
postProcessBeanFactory(beanFactory)(自定义BeanFactory)
clearResourceCaches()清除缓存
是
自定义BeanFactory后置处理
BeanFactoryResourceLoaderApplicationEventPublisherApplicationContext
是否为懒加载
finishBeanFactoryInitialization(beanFactory)(实例化所有的单例Bean)
是否为抽象
抛异常
注册可以解析的自动装配
把applicationEventMulticaster组件注册到容器中
初始化一些属性,自定义属性设置()
获取Bean的定义信息
finishRefresh()(完成容器、Bean创建)
initApplicationEventMulticaster();(初始化事件派发器)
拿到容器中所有的ApplicationListener
1、添加@PostConstruct 2、实现InitializingBean.afterPropertiesSet() 3、定义@Bean(initMethod = \"\")
把messageSource组件注册到容器中
添加Bean后处理器
标记当前Bean正在被创建
注册Bean的销毁方法
获取父工厂是否为空
进行属性校验
beanFactory.registerResolvableDependency(???);
创建DefaultListableBeanFactory
无
执行所有后置处理器 实现 BeanPostProcessor.postProcessBeforeInitialization方法
getBean(beanName)
是否实现FactoryBean接口
执行后置处理器 实现 SmartInitializingSingletonafterSingletonsInstantiated方法
beanFactory.registerSingleton(???);
给容器中注册ApplicationListener
不是自动注入(通常为null)
执行后置处理器 实现 InstantiationAwareBeanPostProcessor
Bean属性赋值
创建一个SimpleApplicationEventMulticaster
国际化功能,消息绑定
给属性赋值,利用反射调用set方法
优先执行实现PriorityOrdered接口的后置处理器再执行实现Ordered接口的后置处理器 再执行所有后置处理器
判断是否有messageSource组件
从singletonObjects中获取是否有BeanName
获取所有Bean名称
创建一个DelegatingMessageSource
BeanPostProcessorDestructionAwareBeanPostProcessorMergedBeanDefinitionPostProcessorInstantiationAwareBeanPostProcessorSmartInstantiationAwareBeanPostProcessor
通过反射机制完成Bean的创建
判断是否有conversionService组件
返回BeanFactory【DefaultListableBeanFactory】
invokeBeanDefinitionRegistryPostProcessors(执行后置处理器)
beanFactory.setBeanClassLoader(getClassLoader());
类
initMessageSource()(初始化MessageSource组件)
this.earlyApplicationListeners = new LinkedHashSet<>(this.applicationListeners);
prepareBeanFactory(beanFactory)(BeanFactory的预处理)
添加一些组件
设置Bean类加载器
prepareRefresh()(刷新前的预处理)
拿到所有BeanFactoryPostProcessor
refreshBeanFactory()
registerBeanPostProcessors(beanFactory)(注册Bean后处理器)
是否正在创建这个Bean
getEnvironment().validateRequiredProperties();
循环创建
默认为空,需自定义后置处理器
方法
???用户自定义后置处理器重写方法???
添加到事件派发器中
重写onRefresh()方法,子类重写这个方法,在容器刷新的时候可以自定义逻辑
添加Bean后处理器ApplicationListenerDetector
registerListeners()(注册监听器)
AbstractApplicationContext
执行后置处理器
BeanFactory初始化
刷新Bean工厂
DefaultListableBeanFactory()
设置其启动日期和,活动标记以及执行属性源的任何初始化。
initPropertySources()
BeanNameAwareBeanClassLoaderAwareBeanFactoryAware
初始化Bean
判断是否有applicationEventMulticaster组件
invokeBeanFactoryPostProcessors(beanFactory)(执行BeanFactoryPostProcessors)
保存容器早期的一些事件
拿到所有BeanDefinitionRegistryPostProcessor
执行Aware接口方法
执行实现XXXAware接口方法
赋值给messageSource
将创建的Bean添加到单例池中
留给子容器(子类)
一些不重要的初始化
ApplicationContextAwareProcessorApplicationListenerDetectorLoadTimeWeaverAwareProcessor(满足条件时)
执行所有后置处理器 实现 BeanPostProcessor.postProcessAfterInitialization方法
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory()(获取Bean工厂)
是否为FactoryBean
singletonObjectsspan style=\"font-size: inherit;\
拿到所有BeanPostProcessor
赋值给applicationEventMulticaster
优先注册实现PriorityOrdered接口的后置处理器再执行实现Ordered接口的后置处理器 再执行所有后置处理器 最后注册所有内部BeanPostProcessor
派发之前的事件
publishEvent(new ContextRefreshedEvent(this));发布时间容器刷新完成
收藏
0 条评论
回复 删除
下一页