spring源码分析(web)--通过注解获取bean源码分析
2017-08-30 11:00
671 查看
本文用流水账的方式记录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提到的下面几个方法里面实例化。
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对注解(Annotation)处理源码分析1——扫描和读取Bean定义
- Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义
- Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义
- S2SH框架中,Spring通过注解获取bean实例
- Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义
- Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义
- 【简记】Java Web 内幕——Spring源码(组件分析,BeanFactory源码,Bean创建之前)
- (转)Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义
- Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义
- Spring IOC 容器源码分析 - 获取单例 bean
- spring 注解源码分析-扫描和读取bean定义
- Spring源码分析 为什么xml定义的bean优先于注解定义的bean ?
- Spring 源码分析《Bean的获取与创建流程》
- Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义
- Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义
- spring mvc框架源码分析(二)-自定义注解以及通过反射获取注解
- 【Spring源码分析】原型Bean实例化过程、byName与byType及FactoryBean获取Bean源码实现
- Spring学习笔记之通过注解配置Bean(1)
- [java][spring]取得通过配置文件和注解注入的bean、取得当前数据库连接、取得ApplicationContext的方法
- Spring源码分析——BeanFactory体系之接口详细分析