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