- 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、activethis.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