【Spring源码系列- IOC】
本文目录
asSourceClass(configClass, filter)
解析各种注解、doProcessConfigurationClass()
递归处理内部类、processMemberClasses()
处理被@PropertySource注解修饰的类、processPropertySource()
解析被@ComponentScan/@ComponentScans注解修饰的包及其子包下的类为类定义、parse()
shouldSkip()
先通过conditionEvaluator条件计算器判断是否跳过当前解析
shouldSkip()中执行具体的判断逻辑
asSourceClass(configClass, filter)
处理配置类
- 由于配置类可能存在父类(若父类的全类名是以java开头的,则除外?)
- configClass如果存在父类,则需要将configClass变成sourceClass去解析,然后返回sourceClass的父类
- 父类为空则不会进行while循环解析,如果父类不为空,则会循环的去解析父类
- sourceClass是一个简单的包装类
- 为了以统一的方式去处理带有注解的类,不管这些类是如何加载的
解析各种注解、doProcessConfigurationClass()
进入该方法
递归处理内部类、processMemberClasses()
此处对processConfigurationClass()方法进行了递归调用(扣题)
处理被@PropertySource注解修饰的类、processPropertySource()
解析加载properties文件,并将属性添加到spring上下文中
processPropertySource(propertySource)
进入上图所示addPropertySource()方法
添加属性资源、addPropertySource()
解析被@ComponentScan/@ComponentScans注解修饰的包及其子包下的类为类定义、parse()
进入解析方法:
-
先创建了一个扫描类
-
依次获取@ComponentScan的相关属性为刚刚创建的扫面类赋值
-
nameGenerator
-
scopedProxy
-
resourcePattern
-
includeFilters
-
excludeFilters
-
lazyInit
-
-
将要扫描的包统一放入集合中
-
使用创建并设置好参数的扫描器处理这个集合(scanner.doScan())
doScan()
在这个方法中,将上一个方法中放置需要扫描的包的集合传入创建好的扫描器进行处理,注册符合要求的BeanDefinition
registerBeanDefinition()
注册BeanDefinition
处理@Import注解、processImports()
由于被import的类也有可能被@Import注解修饰,于是采用了递归处理
处理@ImportResource注解
处理@Bean注解
处理接口的默认方法实现
jdk8开始,接口中的方法可以有自己的默认实现,所以如果这个接口的方法加了@Bean注解,也需要被解析
解析父类
将解析的配置类存储起来
这样当返回到parse()方法时,也能取到值(╯﹏╰)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/135410.html