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注册默认的扫描拦截ComponentManagedBeanNamed
setEnvironment(environment)赋予环境setResourceLoader(resourceLoader)赋予资源加载器
register(annotatedClasses)
注册方法的配置类
doRegisterBean()
注册实际干活的方法
ConditionEvaluator鉴定Condition条件- 判断
@Conditional - 获取
Condition条件集合并进行排序 - 循环判断上述
Condition条件
- 判断
AnnotationConfigUtils.processCommonDefinitionAnnotations(abd)@Lazy@Primary@DependsOn@Role@Description
Qualifier进行处理Primary、Lazy以及其他BeanDefinitionCustomizer#customizeBeanDefinition自定义器处理- 注册
BeanDefinitionHolder的BeanDefinition
scan(basePackages)
扫描包路径
refresh()
据我们所知IOC容器的主要方法是通过refresh方法进行刷新启动,容器刷新创建
prepareRefresh()
准备容器的刷新工作
设置标志位
closed、active1
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)初始化BeaninvokeAwareMethods(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()方法发布
ContextRefreshedEventLiveBeansView注册ApplicationContext