Spring Framework 启动流程
2020-04-07 14:25:28 1 举报
Spring 启动流程分析
作者其他创作
大纲/内容
⑦ preInstantiateSingletons()初始化剩下来的所有单实例 bean在这里会循环所有的 beanNames,挨个调用 getBean() 方法创建对象
obtainFreshBeanFactory()获取 beanFactory,在前面的步骤中已经初始化
applyPropertyValues()应用 Bean 属性的值;为属性利用 setter 方法等进行赋值,真正的赋值操作
refresh()容器刷新,Spring 中最核心的方法
register(annotatedClasses)注入传入的配置类,注意这里允许传入多个
postProcessBeanFactory()
new AnnotationConfigApplicationContext()创建 Spring 容器
先注册实现了 PriorityOrdered 接口的 beanPostProcessor再注册实现了 Ordered 接口的 beanPostProcessor再注册常规的 beanPostProcessor最后注册 MergedBeanDefinitionPostProcessor 类型的 beanPostProcessor此时容器中默认会有 6 个内置的 beanPostProcessor(在无任何代理模式下)【ApplicationContextAwareProcessor】【ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor】【PostProcessorRegistrationDelegate$BeanPostProcessorChecker】【CommonAnnotationBeanPostProcessor】【AutowiredAnnotationBeanPostProcessor】【ApplicationListenerDetector】
GenericApplicationContext#<init>先执行父类初始化方法,实例化一个 DefaultListableBeanFactory 工厂
将之前步骤产生的 ApplicationListener 以及容器中的 ApplicationListener 保存到 applicationEventMulticaster 属性,然后进行事件派发
③ populateBean()给属性赋值
ClassPathBeanDefinitionScanner#<init>实例化 ClassPathBeanDefinitionScanner 扫包器
prepareRefresh()刷新前的预处理
自定义 BeanDefinitionRegistryPostProcessor并非是被 Spring 管理的 PostProcessor
postProcessBeanFactory(beanFactory)子类通过重写这个方法可以在 BeanFactory 创建并与准备完成以后做进一步的设置
addSingleton()如果 bean 已经创建出来了,就添加到【singletonObjects】集合中
applyBeanPostProcessorsAfterInitialization()调用所有 BeanPostProcessors 的 postProcessAfterInitialization() 方法
Spring Bean#<init>通过反射执行 bean 的构造方法,创建对象
判断容器中是否有名为 applicationEventMulticaster 的组件,如果有就从容器中取出来并且给 applicationEventMulticaster 赋值如果没有就创建一个 SimpleApplicationEventMulticaster 事件派发器
getBean()从工厂获取 bean,不存在会自动创建
getMergedLocalBeanDefinition()获取 bean 的定义信息
initMessageSource()初始化 MessageSource 组件:国际化、消息绑定与解析
postProcessBeanDefinitionRegistry()
添加 bean 后置处理器(2个):【ApplicationContextAwareProcessor】、【ApplicationListenerDetector】添加可以解析的自动装配器,即在任何组件中都可以自动注入(4个):【BeanFactory】、【ResourceLoader】、【ApplicationEventPublisher】、【ApplicationContext】添加组件(3个):【environment -》ConfigurableEnvironment】、span style=\"font-size: inherit;\
this()通过 this() 调用无参构造方法
applyMergedBeanDefinitionPostProcessors() 调用【MergedBeanDefinitionPostProcessor】的 postProcessMergedBeanDefinition() 方法
剩下所有常规的BeanDefinitionRegistryPostProcessor
实现了 Ordered 接口的 BeanDefinitionRegistryPostProcessor
① AbstractApplicationContext.refresh()容器刷新
markBeanAsCreated()给 bean 做标识标记
addSingletonFactory()更改 bean 的一些标记信息,向 singletonFactories 中存一份,从 【earlySingletonObjects】 移除对象,向 【registeredSingletons】 存一份,这个对象是个 set 集合,只保存 beanName
这里的 getBeanFactoryPostProcessors() 是指通过 AnnotationConfigApplicationContext.addBeanFactoryPostProcessor() 方法手动传入的,并非是被 Spring 管理的 BeanFactoryPostProcessor
标记 bean 已经在创建中了,即把要创建的 bean 放到 Set<String> alreadyCreated 集合中,表示已经创建过
publishEvent(new ContextRefreshedEvent(this))发布容器刷新完成事件
refreshBeanFactory()刷新 beanFactory,设置序列化 ID
initLifecycleProcessor()初始化和生命周期有关的后置处理器
① resolveBeforeInstantiation()给 BeanPostProcessors 一个机会来返回一个代理对象,而不是目标 bean 的实例
getSingleton()再从容器中获取赋值,因为上面的步骤已经创建好了 bean,所以此时有值
返回对象才会触发
向容器中添加 2 个 baanFactory 后置处理器:【ConfigurationClassPostProcessor】【EventListenerMethodProcessor】向容器中添加 2 个 bean 后置处理器:【AutowiredAnnotationBeanPostProcessor】【CommonAnnotationBeanPostProcessor】向容器中添加普通组件:【DefaultEventListenerFactory】
invokeBeanFactoryPostProcessors(beanFactor)执行 BeanFactoryPostProcessor 方法
getSingleton()获取 bean,如果是 beanFactory 类型,会调用 getObject() 方法创建 bean
初始化
applyBeanPostProcessorsBeforeInitialization()执行所有【BeanPostProcessor】的 postProcessBeforeInitialization() 方法
AbstractBeanFactory.doGetBean()从容器中获取 bean
postProcessPropertyValues()调用【InstantiationAwareBeanPostProcessor】的 postProcessPropertyValues() 方法
afterSingletonsInstantiated()如果 bean 是【SmartInitializingSingleton】类型,会回调 afterSingletonsInstantiated() 方法
⑤ invokeInitMethods()执行初始化方法,有 3 种类型
② doRegisterBean()将配置类 【SpringConfig】注册到容器中,注意这里只是注册 BeanDefinition 信息,并非实例化
createBeanInstance()使用构造方法创建 bean 实例
registerBeanPostProcessors(beanFactory)向容器中注册 bean 后置处理器
② prepareBeanFactory(beanFactory)预处理 beanFactory,向容器中添加一些组件
postProcessAfterInstantiation()调用【InstantiationAwareBeanPostProcessor】的 postProcessAfterInstantiation() 方法
getSingleton()先判断是否已经创建过
⑤ initApplicationEventMulticaster()初始化事件派发器,在注册监听器时会用到
postProcessProperties()调用【InstantiationAwareBeanPostProcessor】的 postProcessProperties() 方法
applyBeanPostProcessorsAfterInitialization()执行所有【BeanPostProcessor】的 postProcessAfterInitialization() 方法
AnnotationConfigApplicationContext#<init>调用构造方法,注意这里是有参的
② doCreateBean()真正的创建对象方法
AnnotatedBeanDefinitionReader#<init>实例化 BeanDefinitionReader 读取器
实现了 PriorityOrdered 接口的 BeanDefinitionRegistryPostProcessor
getLifecycleProcessor().onRefresh()拿到前面定义的生命周期处理器【LifecycleProcessor】回调 onRefresh() 方法
⑥ registerDisposableBeanIfNecessary()注册 Bean 的销毁方法
剩下所有常规的BeanFactoryPostProcessor
createBean()创建 bean 对象
③ invokeBeanFactoryPostProcessors()执行 BeanFactory 后置处理器
⑥ registerListeners()注册监听器,派发之前步骤产生的一些事件(可能没有)
⑧ finishRefresh()发布容器刷新完成事件
onRefresh()留给子容器(子类),子类重写这个方法,在容器刷新的时候可以自定义逻辑,web 场景下会使用
① registerAnnotationConfigProcessors()
getBeanFactory()返回之前初始化中创建的 beanFactory,即【DefaultListableBeanFactory】
determineCandidateConstructors()调用【SmartInstantiationAwareBeanPostProcessor】的determineCandidateConstructors() 方法决定使用哪个构造器来创建 bean 对象
如果返回了 bean 实例,那么下面的 doCreateBean() 方法就会跳过,很多逻辑也不会再执行,慎用
④ registerBeanPostProcessors()按顺序注册 bean 后置处理器
applyBeanPostProcessorsBeforeInstantiation()调用【InstantiationAwareBeanPostProcessor】的 postProcessBeforeInstantiation() 方法
实现了 PriorityOrdered 接口的 BeanFactoryPostProcessor
④ initializeBean()执行 bean 的初始化方法,包含三种,依次数:@PostConstruct、afterPropertiesSet()initMethod()
finishBeanFactoryInitialization(beanFactory)初始化所有的非单实例 bean
实现了 Ordered 接口的 BeanFactoryPostProcessor
0 条评论
下一页