// 现在主要讲这个方法,但是讲不完
我们这个方法干了什么事情
1.得到Spring内置的BeanFactoryPostProcessor,也就是ConfigurationClassPostProcessor,【因为我们没有实现接口】
然后遍历循环他这个接口的扩展方法
ConfigurationClassPostProcessor#postProcessBeanDefinitionRegistry
呢么这个方法又做了什么呢
我上面也讲了 吧bdmap中的bd拿出来,然后将@Configuration标记为full
将@Component,@ComponentScan,@Import @ImportResource标记为lite
然后添加到configCandidates这里面,很显然 这里面目前只有我们一个类就是appconfig,然后对对这个集合进行排序,比方说Springboot当中就有很多@Configuration
Set candidates = new LinkedHashSet<>(configCandidates);
然后把这个集合放入set当中是为了去重
就好比你在这里一直加 register(appconfig.class);
----------------------》然后进行包扫描啊
继续这个类点击去
看看这个do while循环做了什么事情
对所有@Configuration配置的类进行解析
1.解析@PropertySource
我们这里没有@PropertySources这个注解 故而往下看,这个注解主要是为了导入配置文件的
2> 解析@ComponentScan 也就是我们 所说的包扫描
解析@ComponentScan有几个关键点
2.1> 第一他先new了一个scanner 我说了, 他刚开始在构造呢个scanner仅仅是程序员可以在外面调用的 真正的包扫描不是呢个 而是这个,又建立一个名字生成策略
2.2> ta
他这里有个lazyInit属性可以设置全局变量 也就是你把这lazyInit=true 他将来生产出来的bean 的lazy就是true
然后他在这里添加一个比较规则
然后就是包扫描
这个方法点进来看下
也就是说Spring通过扫描出来的beanDefination叫做ScannedGenericBeanDefinition
然后我们跳出来
1.>包扫描拿出bd 也就是我们加了@Component的 比方说userdao
扫描出来的bd得要给他赋初始值,比方说scope ,name
2>
这个点进来 Spring先给扫描出来的bd一套默认的属性
然后再看这个bd是不是被注解标注的
如果是被注解标注的 比方说
@Lazy(true)
User{
int age
}
在吧这个bd设置为注解标注的
然后再调用这个方法吧扫描的bd----------->put到map中
=================================================================================================这个方法主要是递归调用比如说UserDao是否夹杂着其他注解
然后就开始解析我们的@Import
我也说过Spring中解析3个Import怎么用
现在我们就来看看他底层原理吧
1> Class<?> candidateClass = candidate.loadClass(); //得到class对象
2>反射new对象
3>调用selectImports
1.执行方法获取到数组对象
2.再递归调用看看这个对象有没有标注Import
Spring是这个逻辑
1.解析MyImportSelector.class 得到数组对象,再解析UserService1。class
此时这个UserService1.class就是个普通类了