Spring源码解析
2020-11-04 15:08:04 0 举报
spring工厂实例化
作者其他创作
大纲/内容
先判断类是否加了@ComponentScan注解 如果加了注解,拿到加了这个注解的类的所有信息
委托
准备工作,包括设置系统启动时间 是否激活标识位 初始化属性源 property source
最后put到这个map中
processConfigBeanDefinitions(registry)
scanner.doScan(StringUtils.toStringArray(basePackages));
进行了类型的封装(转换)
AnnotatedBeanDefinitionReader
this.reader.register(annotatedClasses);
spring提供的扩展点BeanPostProcessorBeanFactoryPostProcessorBeanDefinitionRegistryPostProcessor
postProcessBeanFactory
postProcessor.postProcessBeanDefinitionRegistry(registry);
findCandidateComponents(basePackage)
扫描包
往BeanDefinitionMap注册一个ConfigurationClassPostProcessor等
添加一个bean表达式解析器,为了让beanFactory去解析bean的表达式
spring得到内部自己维护的BeanDefinitionRegistryPostProcessor
委托 调方法
调用
prepareBeanFactory(beanFactory)
调用扩展方法BeanDefinitionRegistryPostProcessor
metadata = ((AnnotatedBeanDefinition) beanDef).getMetadata()
把class转换成bd最后put到map中
得到beanFactory?因为需要对beanFactory进行设置
解析扫描的基本信息、比如是否过滤,比如是否加入新的包
比如appConfig就是加了@Configuration注解里面有@ComponentScan扫描包
添加这个类ContextAnnotationAutowireCandidateResolver主要为了处理延迟加载的功能
真正扫描的是这个
ClassPathBeanDefinitionScanner
添加了自动注入被忽略的列表
refresh
isFullConfigurationCandidate(metadata)
DefaultListableBeanFactory
invokeBeanFactoryPostProcessors(beanFactory)
registerBeanDefinition
why?因为需要在invokeBeanFactoryPostProcessorsinvokeBeanFactoryPostProcessors主要是在spring的beanFacyory的初始化过程做一些事情怎么做这些事情?委托了多个实现BeanDefinitionRegistryPostProcessor接口的类来做这些事情或者使用BeanFactoryPostProcessor接口的类来做这些事情,有自定义的也有spring内部的其中ConfigurationClassPostProcessor就是spring内部的为什么要添加?因为如果不添加就没办法委托ConfigurationClassPostProcessor做一些功能
4.添加了自动注入被忽略的列表
5.。。。。。。。。。。。。。。。
实例化AnnotatedBeanDefinitionReader
往BeanDefinitionMap中注册
添加这个AnnotationAwareOrderComparator类,主要为了排序
实例化ClassPathBeanDefinitionScanner
6.ApplicationListenerDetector
首先执行AnnotationConfigApplicationContext父类的构造方法
能够扫描db,能够扫描类,并且转换成bd
AnnotationAwareOrderComparator
obtainFreshBeanFactory
1.beanFactory.setBeanClassLoader(getClassLoader());
2.beanFactory.setBeanExpressionResolver
3.ApplicationContextAwareProcessor
checkConfigurationClassCandidate
这个类的方法名叫registerBeanDefinition
实例化一个工厂DefaultListableBeanFactory
这个真正的扫描
doProcessConfigurationClass
Spring 源码
判断metadata是否加了@Configuration注解如果加了,把这个类添加到Set中
注释
方法实现
如果BeanDefinition是AnnotatedBeanDefinition的实例,并且className和BeanDefinition的元数据的类名相同 则直接从BeanDefinition获取Metadata
AnnotationConfigApplicationContext
register
调用这个类循环所有的BeanDefinitionRegistryPostProcessor
beanDefinitionMap
准备好bean工厂,实例化bean对象
scanCandidateComponents
ContextAnnotationAutowireCandidateResolver
doRegisterBean
如何判断
添加了一个后置处理器ApplicationContextAwareProcessor
再执行自己的构造方法
for循环candidates完成后会把这些beanDefinitioon放到registerBeanDefinition中
GenericApplicationContext
AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
目前没有任何实现期待spring后期版本会有实现
添加一个类加载器
parser.parse(candidates)
添加了一个ApplicationListenerDetector后置处理器
prepareRefresh
如果加了@Configuration注解就标识一下FULL为了上面校验出被处理过的,就不需要处理了还要判断是否是普通类是否加了@Component注解如果是,就要把这个类put到bdmap中如果是@Configuration注解是不是需要解析类,扫描包
getBeanFactoryPostProcessors())这个方法是获取自定义的何为自定义的?程序员自己写的,并且没有交给spring进行管理的何为没有交给spring进行管理?没有加@Component注解的
processConfigurationClass
准备bean工厂
postProcessBeanDefinitionRegistry
这一步需要debug调式进入方法内才能看到
截图
处理内部类 一般不会写内部类
调接口 委托
metadata.isAnnotated(Configuration.class.getName());
也就到了beanDefinitionMap中
举例
registerBean(annotatedClass)
扫描完成会返回candidates也就是BeanDefinition
收藏
收藏
0 条评论
下一页