spring源码分析(web)--通过注解获取bean源码分析

本文用流水账的方式记录Spring是怎么在web启动时候一步步进行需要依赖注入的bean的扫描的。

1.0   

由于在web中配置了文件,首先进入的类一般为ContextLoaderListener,由于该类包含一个默认构造器且继承了ContextLoader,所以最开始初始化应该为ContextLoader,在初始化ContextLoader时,会先对其中的static的模块进行初始化。该static 方法会初始化配置文件为ContextLoader.properties,位于org.spring.web.context下,主要的作用为获取创建或者说解析上下文的类XmlWebApplicationContext。

2.0  

 完成上诉初始化后,由于ContextLoaderListener实现了ServletContextListener接口,当servlet的上下文出现变化后会执行contextInitialized方法,上下文的创建和ioc就从这一步开始进行。

3.0   

上诉方法会进入initWebApplicationContext方法,不过这个方法几乎是用于新建一个ConfigurableWebApplicationContext,按照类名这个应该是用于管理配置web上下文,然后进入主题configureAndRefreshWebApplicationContext方法,定义和刷新上下文。(在进行这一步之前, ConfigurableWebApplicationContext cwac =(ConfigurableWebApplicationContext) this.context 会将第一步提到的XmlWebApplicationContext实例化为cwac。  最后的上下文初始化就会在XmlWebApplicationContext这个类进行。)

4.0  

 configureAndRefreshWebApplicationContext方法中前面几乎都是在初始化和定义,知道最后的refresh方法,它将进入实现了该接口的AbstractApplicationContext类中。

5.0   

在AbstractApplicationContext的refresh方法中obtainFreshBeanFactory用于获取新的bean工厂。

6.0  

 获取bean的方法是简单的,但是他不是在getBeanFactory中新创建,而是在refreshBeanFactory从AbstractRefreshableApplicationContext下的refreshBeanFactory初始化的。

7.0   

在AbstractRefreshableApplicationContext中会进入loadBeanDefinitions(),其实这里的this(当前调用方法的对象就已经是XmlWebApplicationContext),所以最后会进入上诉类中进行处理,当然还有一些初始化,比如讲Qualifier标签塞入factory中。

8.0   

在XmlWebApplicationContext中首先会进行一个XmlBeanDefinitionReader的初始化,其实就是后面用于初始化bean的,他将所有的条件准备好后在初始化。这一块很复杂,我还没有看的很透彻。总之就是初始化bean的一系列操作。然后loadBeanDefinitions里面开始初始化.这里会有很多的中间跳转和初始化的准备工作,比如获取resources,定义当前对象为XmlbeanDefinitionReader。也就是定义的xml文件位置和后面进行处理的类的位置。

9.0   

做好部分准备工作后,剩下的事情就是开始初始化了。AbstractBeanDefinitionReader中的loadBeanDefinitions中转入registerBeanDefinitions方法里面,解析好了doc后,就开始注册bean了,中间没有分支,最最后会在DefaultBeanDefinitionDocumentReader的parseBeanDefinitions中开整,没错,差不多上面甚至这一步都还只是一切的准备活动。.

10.0 

最后,这中间的种种准备工作不表了。会进入ClassPathBeanDefinitionScanner中的doScan方法。这准备活动会有一个将注解Component塞入到一个Filter中。用于后面的过滤处理。这个过滤是在doScan下的findCandidateComponents完成的。

最后:他其实扫描的不是servcie等等,而是扫描的service等上面的注解@Component

11.0 

但是一直到现在Spring都是没有初始化bean的,他仅仅是将类扫描后转换成各种BeanDefinition放到Map中存储起来。然后在6.0提到的下面几个方法里面实例化。


    原文作者:Spring Boot
    原文地址: https://blog.csdn.net/u014403377/article/details/77657842
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞