Spring启动源码剖析
2022-10-14 09:22:00 0 举报
解析Spring启动过程,refresh的十二方法详解
作者其他创作
大纲/内容
执行ConfigurationClassPostProcessor的postProcessBeanDefinitionRegistry()方法:
org.springframework.context.event.internalEventListenerProcessor
添加一个Bean的后置处理器:ApplicationListenerDetector
如果某个类实现了这个接口,并且这个类中的某些set方法在接口中也存在,那么这个set方法在自动注入的时候是不会执行的
EnvironmentAwareEmbeddedValueResolverAwareResourceLoaderAwareApplicationEventPublisherAwareMessageSourceAwareApplicationContextAware另外其实在构造BeanFactory的时候(AbstractAutowireCapableBeanFactory构造方法)就已经提前添加了另外三个:BeanNameAwareBeanClassLoaderAwareBeanFactoryAware
注册扫进来的类为BeanDefinition
initMessageSource();#设置国际化
发布ContextRefreshedEvent事件
AnnotationConfigUtils.registerAnnotationConfigProcessors
prepareRefresh();
用来判断某个Bean是不是实现了LoadTimeWeaverAware接口,如果实现了则把ApplicationContext中的loadTimeWeaver回调setLoadTimeWeaver方法设置给该Bean。
执行所有BeanDefinitionRegistryPostProcessor的postProcessBeanFactory()方法
org.springframework.context.annotation.internalCommonAnnotationProcessor
解析配置类
调用lifecycleProcessor的onRefresh()方法,如果是DefaultLifecycleProcessor,那么会获取所有类型为Lifecycle的Bean对象,然后调用它的start()方法,这就是ApplicationContext的生命周期扩展机制
registerListeners();#注册监听器,则把监听器设置到事件发布器上
设置表达式解析器StandardBeanExpressionResolver
\"environment\":Environment对象\"systemProperties\":System.getProperties()返回的Map对象\"systemEnvironment\":System.getenv()返回的Map对象“applicationStartup”:ApplicationStartup对象
完成BeanFactory的初始化,主要就是实例化非懒加载的单例Bean,
initApplicationEventMulticaster();#初始化事件广播器(事件发布器)默认用SimpleApplicationEventMulticaster事件
refresh()
添加一些单例bean到单例池:
prepareBeanFactory(beanFactory);
obtainFreshBeanFactory()
registerBeanPostProcessors(beanFactory);
用来解析Spring中的表达式
扫描得到BeanDefinition并注册
因为上面的步骤完成了扫描,这个过程中程序员可能自己定义了一些BeanPostProcessor,在这一步就会把BeanFactory中所有的BeanPostProcessor找出来并实例化得到一个对象,并添加到BeanFactory中去(属性beanPostProcessors),最后再重新添加一个ApplicationListenerDetector对象(之前其实就添加了过,这里是为了把ApplicationListenerDetector移动到最后)
添加一个Bean的后置处理器:ApplicationContextAwareProcessor
会调用父类GenericApplicationContext的无参构造方法,会构造一个BeanFactorythis.beanFactory = new DefaultListableBeanFactory();
解析AppConfig类
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
从BeanFactory中找到类型为BeanDefinitionRegistryPostProcessor的beanName,也就是ConfigurationClassPostProcessor, 然后调用BeanFactory的getBean方法得到实例对象
如果BeanFactory中存在一个叫做\"messageSource\"的BeanDefinition,那么就会把这个Bean对象创建出来并赋值给ApplicationContext的messageSource属性,让ApplicationContext拥有国际化的功能
执行还没有执行过的BeanFactoryPostProcessor的postProcessBeanFactory()方法
//子类无参构造AnnotationConfigApplicationContext()
new AnnotationConfigApplicationContext(AppConfig.class)
执行其他BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry()方法
添加PropertyEditorRegistrar:ResourceEditorRegistrar
invokeBeanFactoryPostProcessors(beanFactory);
添加一个Bean的后置处理器:LoadTimeWeaverAwareProcessor
finishBeanFactoryInitialization(beanFactory);#实例化非懒加载的bean
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
从BeanFactory中找到类型为BeanFactoryPostProcessor的beanName,而这些BeanFactoryPostProcessor包括了上面的BeanDefinitionRegistryPostProcessor
从BeanFactory中获取ApplicationListener类型的beanName,然后添加到ApplicationContext中的事件广播器applicationEventMulticaster中去,到这一步因为FactoryBean还没有调用getObject()方法生成Bean对象,所以这里要在根据类型找一下ApplicationListener,记录一下对应的beanName
设置ApplicationContext的lifecycleProcessor,默认情况下设置的是DefaultLifecycleProcessor
设置beanFactory类加载器
1. 设置BeanFactory的类加载器、SpringEL表达式解析器、类型转化注册器2. 添加三个BeanPostProcessor,注意是具体的BeanPostProcessor实例对象3. 记录ignoreDependencyInterface4. 记录ResolvableDependency5. 添加三个单例Bean
用来注册一些默认的PropertyEditor类型转换器
register
finishRefresh();#完成刷新启动
创建BeanDefinitionScanner 扫描器this.scanner = new ClassPathBeanDefinitionScanner(this);
1.记录启动时间 2.可以允许子容器设置一些内容到Environment中3.验证Environment中是否包括了必须要有的属性
postProcessBeanFactory(beanFactory);#子类来设置一下BeanFactory
调用sccanner.scan()完成扫描,执行BeanFactoryPostProcessor
添加ignoredDependencyInterface
org.springframework.context.event.internalEventListenerFactory
解析@Import,@Bean等注解得到BeanDefinition并注册
beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
如果BeanFactory中存在一个叫做\"applicationEventMulticaster\"的BeanDefinition,那么就会把这个Bean对象创建出来并赋值给ApplicationContext的applicationEventMulticaster属性,让ApplicationContext拥有事件发布的功能
this()方法
父类无参构造GenericApplicationContext()
用来执行EnvironmentAware、ApplicationEventPublisherAware等回调方法
用来判断某个Bean是不是ApplicationListener,如果是则把这个Bean添加到ApplicationContext中去,注意一个ApplicationListener只能是单例的
创建一个读取配置类的BeanDefinitionReader(Bean定义读取器)this.reader = new AnnotatedBeanDefinitionReader(this);
beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
0 条评论
下一页