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