Spring 注解编程IOC源码
- Spring 注解编程
IOC
涉及的主要类 - Spring 注解编程
IOC
源码分析
Spring 注解编程IOC
涉及的主要类
AnnotationConfigApplicationContext
org.springframework.context.annotation.AnnotationConfigApplicationContext
注解的启动容器入口
AbstractApplicationContext
org.springframework.context.support.AbstractApplicationContext
容器的执行方法抽象类
AnnotatedBeanDefinitionReader
org.springframework.context.annotation.AnnotatedBeanDefinitionReader
注解Bean
定义的读取器
ClassPathBeanDefinitionScanner
org.springframework.context.annotation.ClassPathBeanDefinitionScanner
类路径的Bean
定义扫描
DefaultListableBeanFactory
org.springframework.beans.factory.support.DefaultListableBeanFactory
BeanFactory
的工厂,主要的
PostProcessorRegistrationDelegate
org.springframework.context.support.PostProcessorRegistrationDelegate
后置处理的委派类
AnnotationConfigUtils
org.springframework.context.annotation.AnnotationConfigUtils
注解配置的工具类
AbstractBeanFactory
org.springframework.beans.factory.support.AbstractBeanFactory
抽象BeanFactory
AbstractAutowireCapableBeanFactory
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory
自动注入的抽象BeanFactory
Spring 注解编程IOC
源码分析
构造器
创建BeanFactory
–DefaultListableBeanFactory
创建reader
–AnnotatedBeanDefinitionReader
ConditionEvaluator
@Conditional
鉴定器
AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry)
注册注解配置的后置处理器
- 赋值
DependencyComparator
–AnnotationAwareOrderComparator
- 赋值
AutowireCandidateResolver
–ContextAnnotationAutowireCandidateResolver
- 注册
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
–ConfigurationClassPostProcessor
- 注册
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
–AutowiredAnnotationBeanPostProcessor
- 注册
org.springframework.context.annotation.internalCommonAnnotationProcessor
–CommonAnnotationBeanPostProcessor
- 注册
org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor
–PersistenceAnnotationBeanPostProcessor
- 注册
org.springframework.context.event.internalEventListenerProcessor
–EventListenerMethodProcessor
- 注册
org.springframework.context.event.internalEventListenerFactory
–DefaultEventListenerFactory
创建scanner
–hhh
registerDefaultFilters
注册默认的扫描拦截Component
ManagedBean
Named
setEnvironment(environment)
赋予环境setResourceLoader(resourceLoader)
赋予资源加载器
register(annotatedClasses)
注册方法的配置类
doRegisterBean()
注册实际干活的方法
ConditionEvaluator
鉴定Condition条件
- 判断
@Conditional
- 获取
Condition
条件集合并进行排序 - 循环判断上述
Condition
条件
- 判断
AnnotationConfigUtils.processCommonDefinitionAnnotations(abd)
@Lazy
@Primary
@DependsOn
@Role
@Description
Qualifier
进行处理Primary
、Lazy
以及其他BeanDefinitionCustomizer#customize
BeanDefinition
自定义器处理- 注册
BeanDefinitionHolder
的BeanDefinition
scan(basePackages)
扫描包路径
refresh()
据我们所知IOC
容器的主要方法是通过refresh方法进行刷新启动,容器刷新创建
prepareRefresh()
准备容器的刷新工作
设置标志位
closed
、active
1
2this.closed.set(false);
this.active.set(true);initPropertySources()
初始化属性配置文件,未进行实现,需要子类自行实现
getEnvironment().validateRequiredProperties()
obtainFreshBeanFactory()
告诉子类刷新内部的BeanFactory
refreshBeanFactory()
通过AtomicBoolean.compareAndSet(false, true)来控制一个
BeanFactory
,并设置一个序列化的ID值,若是需要的话,可以通过这个序列化ID来发序列化为BeanFactory
返回构造器初始化的
BeanFactory
prepareBeanFactory(beanFactory)
上下文中准备使用的BeanFactory
赋值
BeanClassLoader
赋值
BeanExpressionResolver
–StandardBeanExpressionResolver
添加
PropertyEditorRegistrar
–ResourceEditorRegistrar
添加
BeanPostProcessor
–ApplicationContextAwareProcessor
,实现Aware
接口方法的赋值EnvironmentAware
、EmbeddedValueResolverAware
、ResourceLoaderAware
、ApplicationEventPublisherAware
、MessageSourceAware
、ApplicationContextAware
去掉上面的依赖接口,避免重复调用
注册依赖类
BeanFactory
、ResourceLoader
、ApplicationEventPublisher
、ApplicationContext
添加
BeanPostProcessor
–ApplicationListenerDetector
处理ApplicationListener
事件监听如果包含
loadTimeWeaver
这个Bean
,添加对应的BeanPostProcessor
–LoadTimeWeaverAwareProcessor
以及赋值TempClassLoader
–ContextTypeMatchClassLoader
注册环境信息的
Bean
environment
–StandardEnvironment
systemProperties
–getEnvironment().getSystemProperties()
systemEnvironment
–getEnvironment().getSystemEnvironment()
postProcessBeanFactory(beanFactory)
子类在上下文中后置处理BeanFactory
invokeBeanFactoryPostProcessors(beanFactory)
调用BeanFactoryPostProcesser
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
后置处理器的委派处理类
BeanDefinitionRegistry
的处理- 处理上面添加的
BeanFactoryPostProcessor
的BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry(registry)
- 获取
BeanFatory
中所有的BeanDefinitionRegistryPostProcessor
- 实现
PriorityOrdered
的接口的BeanDefinitionRegistryPostProcessor
排序并执行BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry(registry)
- 实现
Ordered
的接口的BeanDefinitionRegistryPostProcessor
排序并执行BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry(registry)
- 剩下的
BeanDefinitionRegistryPostProcessor
排序并执行BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry(registry)
- 执行所有的
BeanDefinitionRegistryPostProcessor#postProcessBeanFactory(beanFactory)
- 执行除
BeanDefinitionRegistryPostProcessor
的BeanDefinitionRegistry#postProcessBeanFactory(beanFactory)
- 处理上面添加的
- 直接执行除
BeanDefinitionRegistryPostProcessor
的BeanDefinitionRegistry#postProcessBeanFactory(beanFactory)
,与上述1互斥 BeanFactoryPostProcessor
的处理- 实现
PriorityOrdered
的BeanFactoryPostProcessor
排序并执行BeanFactoryPostProcessor.postProcessBeanFactory(beanFactory)
- 实现
Ordered
的BeanFactoryPostProcessor
排序并执行BeanFactoryPostProcessor.postProcessBeanFactory(beanFactory)
- 剩下的
BeanFactoryPostProcessor
执行BeanFactoryPostProcessor.postProcessBeanFactory(beanFactory)
- 清除后置处理器可能改变的原元数据信息
- 实现
重置了添加对应的
BeanPostProcessor
–LoadTimeWeaverAwareProcessor
以及赋值TempClassLoader
–ContextTypeMatchClassLoader
registerBeanPostProcessors(beanFactory)
注册拦截Bean
创建的BeanPostProcessor
PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
- 添加
BeanPostProcessor
–BeanPostProcessorChecker
- 实现
PriorityOrdered
的除掉MergedBeanDefinitionPostProcessor
的BeanPostProcessor
排序并进行注册 - 实现
Ordered
的除掉MergedBeanDefinitionPostProcessor
的BeanPostProcessor
排序并进行注册 - 剩下的除掉
MergedBeanDefinitionPostProcessor
的BeanPostProcessor
进行注册 MergedBeanDefinitionPostProcessor
排序并注册- 添加了一个
BeanPostProcessor
–ApplicationListenerDetector
initMessageSource()
初始化MessageSource
- 判断可有
messageSource
的Bean
- 有,判断当前
messageSource
是否是HierarchicalMessageSource
,是的话赋值ParentMessageSource - 没有,注册
messageSource
–DelegatingMessageSource
,并赋值ParentMessageSource
- 有,判断当前
initApplicationEventMulticaster()
初始化ApplicationEvent
派发器,注册applicationEventMulticaster
– SimpleApplicationEventMulticaster
onRefresh()
模板方法来添加上下文刷新工作,子类进行实现
registerListeners()
注册监听器
ApplicationEvent
派发器添加事件ApplicationEvent
派发器添加事件Bean
- 派发早期处理事件
finishBeanFactoryInitialization(beanFactory)
完成BeanFactory
的实例化
- 初始化
ConversionService
- 注册
EmbeddedValueResolver
- 初始化
LoadTimeWeaverAware
接口的Bean
- 完成非惰性加载的单实例
Bean
初始化- 触发非惰性加载的单实例
Bean
初始化getBean()
- 若是
SmartInitializingSingleton
触发回调smartSingleton.afterSingletonsInstantiated()
- 触发非惰性加载的单实例
getBean(beanName) – doGetBean()
获取Bean
的实例
从
FactoryBean
中获取Bean
判断
parentBeanFactory
以及parentBeanFactory
包含当前Bean
,从parentBeanFactory
进行获取循环获取DependsOn的
Bean
创建
Bean
–createBean(beanName, mbd, args)
准备方法的覆盖重写 –
prepareMethodOverrides()
尝试让
BeanPostProcessor
返回一个代理Bean
–resolveBeforeInstantiation(beanName, mbdToUse)
真正创建
Bean
实例 –doCreateBean(beanName, mbdToUse, args)
,Bean
的整个生命周期createBeanInstance(beanName, mbd, args)
实例化applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName)
MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition(mbd, beanType, beanName)
方法处理populateBean(beanName, mbd, instanceWrapper)
属性赋值,包含自动注入initializeBean(beanName, exposedObject, mbd)
初始化Bean
invokeAwareMethods(beanName, bean)
调用aware接口方法applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName)
BeanPostProcessor.postProcessBeforeInitialization()
前置方法invokeInitMethods(beanName, wrappedBean, mbd)
- 先调用
InitializingBean.afterPropertiesSet()
- 反射调用init-method的方法
- 先调用
applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName)
BeanPostProcessor.postProcessAfterInitialization
后置方法
检查循环依赖
registerDisposableBeanIfNecessary(beanName, bean, mbd)
注册Bean
的销毁方法org.springframework.beans.factory.support.DisposableBeanAdapter
检查必须的类型是否匹配
finishRefresh()
clearResourceCaches();
清楚资源缓存initLifecycleProcessor()
初始化LifecycleProcessor
注册lifecycleProcessor–DefaultLifecycleProcessor
getLifecycleProcessor().onRefresh()
调用LifecycleProcessor#onRefresh()
方法发布
ContextRefreshedEvent
LiveBeansView
注册ApplicationContext