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 
 2- this.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