Spring注解创建容器源码分析
2020-05-09 13:48:00 61 举报
Spring容器启动源码
作者其他创作
大纲/内容
refreshBeanFactory()
注册的后置处理器:ApplicationContextAwareProcessorApplicationListenerDetector注册属性修改器:ResourceEditorRegistrar(import的一种方式)
带有这些注解的类会被扫描到
AbstractApplicationContext.refresh()
registerBeanPostProcessors(beanFactory)
向容器中注入公共配置后置处理器
初始化bean
AnnotationConfigUtils.processCommonDefinitionAnnotations(abd)
10.注册监听器并广播可能存在的早期容器事件
省略一些代码分析
构造条件计算器
AbstractApplicationContex.obtainFreshBeanFactory()
invokeBeanFactoryPostProcessors(beanFactory)
new AnnotationConfigApplicationContext(***.class)
4.定制修改BeanFactory(拓展)
3.解析出持有对象中的BeanDefinition向BeanFactory中注册,将自定义的配置类定义信息放入BeanDefinitionMap
12. 完成刷新动作,发送刷新完成容器事件
生成配置类
finishRefresh()
3.执行实现InitializingBean接口的afterPropertiesSet方法和自定义初始化方法
AbstractBeanFactory.transformedBeanName(name)
是否暴露早期bean实例
初始化剩余bean
prepareBeanFactory(beanFactory)
finishBeanFactoryInitialization(beanFactory)
2.执行后置处理器的before方法
给beanset值
扫描组件利用ClassPathBeanDefinitionScanner.doScan()去获取basePackages包下的所有带有@Component的类
AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry)
如果是单例bean的情况
注册默认的过滤器
重点看下
AnnotationConfigApplicationContext.refresh()
1.如果bean实现相对应aware接口
beanFactory.addBeanPostProcessor(postProcessor)
11.初始化剩下的非懒加载的单实例bean
AbstractApplicationContext.prepareRefresh()
ConfigurationClassPostProcessorAutowiredAnnotationBeanPostProcessorRequiredAnnotationBeanPostProcessorCommonAnnotationBeanPostProcessorEventListenerMethodProcessorDefaultEventListenerFactory
parser.parse(candidates)
ClassPathBeanDefinitionScanner.registerDefaultFilters()
postProcessBeanFactory(beanFactory)
doGetBean需要重新调试走一遍
5.执行工厂后置处理器,解析出@Configuration配置的类
registerListeners()
register(annotatedClasses)
getBeanFactory()
6.注册Bean后置处理器
7.初始化国际化资源
4.执行后置处理器的after方法
8. 初始化多播器
构造器注入
获取beanName,如果是FactoryBean先去除前缀&,再判断是否有别名取出最后的beanName
单独针对这个BeanDefinition解析
3:1.配置类加载器2.注册后置处理器3.注册环境基础bean
容器中注册的BeanDefinition
1. @Component2.@Service3.@Controller4.@Repository5.JSR250 6JSR330
initApplicationEventMulticaster()
处理配置bean定义信息
如果有自定义销毁方法注册到容器
1.设置启动时间和激活标签2.初始化占位符资源(拓展)3.创建earlyApplicationEvents
onRefresh()
容器刷新核心点
beanFactory.preInstantiateSingletons()
initMessageSource()
singletonFactory.getObject()
ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(registry)
1.解析配置类的BeanDefinition
如果bean是FactoryBean则先从缓存中取,缓存中不存在通过getObject()取。如果不是直接返回
AbstractBeanFactory.getBean(beanName)
按照优先级排序分先后顺序执行将获取到的单例beanPostProcessor放入beanFactory
解析出@Confguration中的其他bean信息
processConfigBeanDefinitions(registry)
1.其中一个实现给beanfactory设置序列号
AnnotatedBeanDefinitionReader
如果beanFactory中已经加载了bean直接获取,否则new SimpleApplicationEventMulticaster(beanFactory)
9. 由子类去初始化特殊bean
earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&\t\t\t\tisSingletonCurrentlyInCreation(beanName))
从beanDefinitionNames中获取所有的定义信息筛选出带有@Configuration的定义信息
2.返回beanFactory
ClassPathBeanDefinitionScanner
2.得到一个BeanFactory
0 条评论
下一页