Spring启动流程
2021-09-27 11:07:28 0 举报
Spring启动流程
作者其他创作
大纲/内容
AnnotationConfigApplicationContext(AppConfig.class)
父类GenericApplicationContext的构造方法
this.beanFactory = new DefaultListableBeanFactory();
主要生成默认的beanFactory, 而DefaultListableBeanFactory在实例化的时候就会在自动装配时,忽略给定的依赖接口。这一段添加3个aware回调接口。 BeanNameAware.class,BeanFactoryAware.class,BeanClassLoaderAware.class
this()
this.reader = new AnnotatedBeanDefinitionReader(this); 创建一个Bean定义的读取器
this(registry, getOrCreateEnvironment(registry)); 注册
getOrCreateEnvironment(registry) ---> 得到一个环境对象
this.conditionEvaluator = new ConditionEvaluator(registry, environment, null); --->创建一个条件解析器
AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry); this.registry =AnnotationConfigApplicationContext
registerAnnotationConfigProcessors(registry, null);
unwrapDefaultListableBeanFactory(registry); 获取到DefaultListableBeanFactory去注册
注册注解Order,Priority比较器 AnnotationAwareOrderComparator
注册ContextAnnotationAutowireCandidateResolver 用于寻找Autowire标识的inject注册点,field或是method
注册一些beanDefinition 如用于扫描component类,类中属性赋值....这是spring中相当重要的一环
ConfigurationClassPostProcessor ,主要用于扫描获取component,@Bean,@Configuration之类注解标志的类,将其加入BeanDefinitionMap中。
AutowiredAnnotationBeanPostProcessor @Autowire 填充该注解标识的field和method
顺嘴一提,属性注入不管是autowire还是resource都是实现InstantiationAwareBeanPostProcessor 中的 postProcessProperties 它会在bean实例化后去填充属性,之后才是初始化流程
CommonAnnotationBeanPostProcessor @Resource 填充该注解标识的field和method
PersistenceAnnotationBeanPostProcessor 用于实现jpa
EventListenerMethodProcessor 用于实现 @EventListener 会在所有单例bean完成bean的实例化初始化后调用,去扫描实现该注解的接口。也就是说在bean的初始化方法中发布event对于注解实现的监听器是无效的,但是使用接口实现的监听器是ok的。
然后再注册 DefaultEventListenerFactory
this.scanner = new ClassPathBeanDefinitionScanner(this); 这个在spring流程中没啥用,主要是给程序员用的,spring会在reader中自己去new出一个扫描器
register(annotatedClasses); 将配置类注册到BeanDefinitionMap中
refresh
prepareRefresh
initPropertySources 可以初始化一些kv属性到context环境中
getEnvironment().validateRequiredProperties(); 校验该环境是否缺少必要的属性
obtainFreshBeanFactory 主要就是为了获取到BeanFactory 不同的Context也在这边做是否可以重复Refresh的操作
prepareBeanFactory 预先配置Bean工厂
代码就不复制了,自己对着看。简单来说就是在这边去配置了SPEL的解析器; 类转化器(比如使用 @value 一段string转化成某个Bean,默认的很鸡肋,需要程序员自己实现转化器 ); ApplicationContextAwareProcessor 实现bean回调的后置处理器;一堆自动装配时,忽略给定的依赖接口的aware;将BeanFactory,ResourceLoader,ResourceLoader,ApplicationContext注册;注册ApplicationListenerDetector后置处理器;将Environment也注册到ioc;
postProcessBeanFactory 加载所有bean定义,但还没有实例化bean。这允许在特定的ApplicationContext实现中注册特殊的BeanPostProcessors等。一般都是注册些web相关的
invokeBeanFactoryPostProcessors
执行BeanFactory的后置处理器,这个相当重要,独立拉出来,里面太繁琐了,主要就是执行之前的ConfigurationClassPostProcessor 扫描注册到 BeanDefinitionMap
registerBeanPostProcessors 将扫描到的Bean后置处理器排排序,加入到集合中后序在bean 的生命周期中调用
initMessageSource 国际化
initApplicationEventMulticaster
this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);生成默认的事件多播器,支持异步
onRefresh 没啥用
registerListeners 主要是用于注册使用接口定义的监听器,而使用注解的监听器是在所有bean实例化初始化后注册的,解答上
finishBeanFactoryInitialization
非懒加载的bean都会在这边完成实例化,属性赋值,和初始化 很复杂,详情见《bean生命周期流程图》
finishRefresh
1.在所有bean都完成实例初始化后,会扫描所有实现了SmartLifecycle接口的类,调用start方法
2.publishEvent(new ContextRefreshedEvent(this)); 发布event
spring中的扩展点很多,像BeanFactory后置处理器,bean后置处理器,event,SmartLifecycle等等。都作为很多框架或者是中间件的扩展点。之后梳理一份。
0 条评论
下一页