Spring启动流程详解
2021-02-21 19:44:41 12 举报
Spring启动流程主要包括以下几个步骤:首先,通过读取配置文件,获取到需要创建的bean信息;然后,根据这些信息,实例化bean对象,并将其添加到容器中;接着,对bean进行属性注入和初始化操作;最后,当容器创建完成后,根据配置文件中的指定,启动应用上下文。在整个过程中,Spring框架会负责管理和维护bean对象,确保其正确性和稳定性。此外,Spring还提供了一些高级功能,如AOP、事务管理等,可以进一步提高开发效率和代码质量。总之,Spring启动流程是一个复杂而又重要的过程,对于Java开发者来说,掌握其基本原理和方法是非常必要的。
作者其他创作
大纲/内容
prepareBeanFactory(beanFactory)
prepareRefresh()
添加ignoredDependencyInterface
到此,所有的BeanFactoryPostProcessor的逻辑都执行完了,主要做的事情就是得到BeanDefinition并注册到BeanFactory中
finishBeanFactoryInitialization(beanFactory):完成BeanFactory的初始化,主要就是实例化非懒加载的单例Bean
扫描得到BeanDefinition并注册
设置dependencyComparator
postProcessBeanFactory(beanFactory)
BeanFactory.class:当前BeanFactory对象ResourceLoader.class:当前ApplicationContext对象ApplicationEventPublisher.class:当前ApplicationContext对象ApplicationContext.class:当前ApplicationContext对象
用来判断某个Bean是不是ApplicationContextAware等等,如果是则执行Aware回调
设置beanFactory的类加载器
执行LifecycleBean
发布ContextRefreshedEvent事件
向BeanFactory中添加EventListenerMethodProcessor对应的BeanDefinition
onRefresh():提供给AbstractApplicationContext的子类进行扩展,没用
会处理Bean中的@Resource注解进行依赖注入
解析@Import,@Bean等注解得到BeanDefinition并注册
自动注入候选者解析器,用来判断某个Bean针对当前依赖是否能进行自动注入
添加一些单例bean到单例池
initMessageSource():如果BeanFactory中存在一个叫做\"messageSource\"的BeanDefinition,那么就会把这个Bean对象创建出来并赋值给ApplicationContext的messageSource属性,让ApplicationContext拥有国际化的功能
添加一个Bean的后置处理器:ApplicationContextAwareProcessor
会处理Bean中@Autowired注解、@Value注解进行依赖注入
执行还没有执行过的BeanFactoryPostProcessor的postProcessBeanFactory()方法
和上面一起使用,DefaultEventListenerFactory中定义了如何把@EventListener封装为ApplicationListener
接下来就是调用refresh方法
从BeanFactory中找到类型为BeanFactoryPostProcessor的beanName,而这些BeanFactoryPostProcessor包括了上面的BeanDefinitionRegistryPostProcessor
向BeanFactory中添加CommonAnnotationBeanPostProcessor对应的BeanDefinition
使得ApplicationListenerDetector为BeanPostProcessor列表中的最后一个
执行其他BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry()方法
设置ApplicationContext的lifecycleProcessor
用来解析单例Bean中被@EventListener注解了的方法,并封装为ApplicationListener并添加到ApplicationContext中
registerListeners():从BeanFactory中获取ApplicationListener类型的beanName,然后添加到ApplicationContext中的事件广播器applicationEventMulticaster中去
registerBeanPostProcessors(beanFactory):因为上面的步骤完成了扫描,这个过程中程序员可能自己定义了一些BeanPostProcessor,在这一步就会把BeanFactory中所有的BeanPostProcessor找出来并实例化得到一个对象,并添加到BeanFactory中去(属性beanPostProcessors),最后直接添加一个ApplicationListenerDetector对象(也是一个BeanPostProcessor)
设置autowireCandidateResolver
构造一个BeanFactory,为DefaultListableBeanFactory
执行所有BeanDefinitionRegistryPostProcessor的postProcessBeanFactory()方法
\"environment\":Environment对象\"systemProperties\":System.getProperties()返回的Map对象\"systemEnvironment\":System.getenv()返回的Map对象
构造ClassPathBeanDefinitionScanner
向BeanFactory中添加DefaultEventListenerFactory对应的BeanDefinition
利用reader注册AppConfig为BeanDefinition,类型为AnnotatedGenericBeanDefinition
添加resolvableDependencies
验证Environment中是否包括了必须要有的属性
b style=\
比较器,可以用来排序,获取@Priority的值,Ordered接口的值,@Order注解的值
initApplicationEventMulticaster():如果BeanFactory中存在一个叫做\"applicationEventMulticaster\"的BeanDefinition,那么就会把这个Bean对象创建出来并赋值给ApplicationContext的applicationEventMulticaster属性,让ApplicationContext拥有事件发布的功能
finishRefresh():BeanFactory的初始化完后,就到了Spring启动的最后一步了
解析AppConfig类
注册一些默认的类型转换器
EnvironmentAwareEmbeddedValueResolverAwareResourceLoaderAwareApplicationEventPublisherAwareMessageSourceAwareApplicationContextAware另外其实在构造BeanFactory的时候就已经提前添加了另外三个:BeanNameAwareBeanClassLoaderAwareBeanFactoryAware
添加一个Bean的后置处理器:ApplicationListenerDetector
是一个Bean的后置处理器,检查某个Bean是不是一个ApplicationListener,如果是会添加到ApplicationContext中去
向BeanFactory中添加ConfigurationClassPostProcessor对应的BeanDefinition
obtainFreshBeanFactory
如果某个类实现了这个集合中的接口,那么对应的set方法不会被用来进行byType或byName的自动注入
设置表达式解析器:StandardBeanExpressionResolver
记录启动时间
从BeanFactory中找到类型为BeanDefinitionRegistryPostProcessor的beanName,也就是ConfigurationClassPostProcessor, 然后调用BeanFactory的getBean方法得到实例对象
添加PropertyEditorRegistrar:ResourceEditorRegistrar
向BeanFactory中添加AutowiredAnnotationBeanPostProcessor对应的BeanDefinition
在构造过程中会添加@Component注解对应的AnnotationTypeFilter到includeFilters中
invokeBeanFactoryPostProcessors(beanFactory)
构造AnnotatedBeanDefinitionReader
执行ConfigurationClassPostProcessor的postProcessBeanDefinitionRegistry()方法
直接绑定某个类型和对应的Bean对象,在进行自动注入时会优先从这个Map中找类型对应的Bean
0 条评论
下一页