spring boot上的大体流程.

自动配置的解析入口在ConfigurationClassPostProcessor类的postProcessBeanDefinitionRegistry方法上.我们从这里来分析其具体的实现.

1.processConfigBeanDefinition首先来看这个函数的实现.
1).首先从defaultListableBeanFactory中拿到所有的已经注册的bean
2).然后对所有的bean进行检测,看其是不是满足条件的注解类.条件如下
Configuration.class
Component.class
ComponentScan.class
Import.class
ImportResource.class
看这个bean是不是包含上述注解.如果没有,则进行最后一个检测,检测这个类的所有成员方法是否有Bean.class的注解.
3)生成ConfigurationClassParser对象.开始对所有满足条件的Bean进行解析.
2.doProcessConfigurationClass
1)首先判断是不是一个Component.class注解类.如果是,则进行下面操作
<1>.判断这个类有没有内部类.如果没有over
<2>.如果有内部类,那么继续对内部类判断是不是满足1. 2)要求.如果满足.递归解析
2).判断类里面有没PropertySources.class的注解.如果有调用processPropertySource来处理它
3).判断类里面有没有ComponentScans.class的注解.如果有则进行解析.里面大体看了下,先查找bean,有的话就把注册到beanMap中.同时再继续对这个bean进行parse
4).判断是不是import.class注解.如果是,则读取其注解的value属性.然后再对数据进行处理.有三种情况1.这个类为ImportSelector.class子类.2.这个类为ImportBeanDefinitionRegistrar子类.3.以上两个都不是,则这个类递归上述调用.
5)判断是不是ImportResource.class注解,如果是获取属性值放到map中
6),检测Bean.class这个注解属性的Method.如果有.则加入到set中去
7).检测这个类是是否有interface.如果有继续检测这个interface里面是否有Bean.class的注解方法且不为abstract.如果有则加入到set中.
8)判断这个使用注解的类是不是有父类.如果有,把它父类拿过出按上面的方法整一遍
到这里就解析完了.要注意的是所有符合要求的注解类,都被包裹生成一个configurationClasses对象.所有的configurationClasses对象都被存储起来了.如图’
我们上述解析过程生成的数据,要么直接注册到BeanMap里去了.要么被包存在对象中了.看ConfigurationClass最重要的几个成员变量.
所以在解析完成之后,有个对所有的configuration总处理的地方看代码

这里就是这个loadBeanDefinitions这里是处理所有的解析生成数据的地.基本上是注册BeanMap的操作.
需要注意的是,上面的操作是针对已经存在的bean map进行处理的,如果不在bean map里面是不会处理的.那么符号条件的bean第一次是在什么时候被注册到bean map里面呢,这个处理是在ClassPathBeanDefinitionScanner.java类里面处理的.扫描指定的classpath下面所有满足条件的类并注册到bean map中去.

864

被折叠的 条评论
为什么被折叠?



