Spring 注解编程IOC源码

  1. Spring 注解编程IOC涉及的主要类
  2. 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源码分析

构造器

创建BeanFactoryDefaultListableBeanFactory

创建readerAnnotatedBeanDefinitionReader

ConditionEvaluator @Conditional鉴定器

AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry)

注册注解配置的后置处理器

  1. 赋值DependencyComparatorAnnotationAwareOrderComparator
  2. 赋值AutowireCandidateResolverContextAnnotationAutowireCandidateResolver
  3. 注册org.springframework.context.annotation.internalConfigurationAnnotationProcessorConfigurationClassPostProcessor
  4. 注册org.springframework.context.annotation.internalAutowiredAnnotationProcessorAutowiredAnnotationBeanPostProcessor
  5. 注册org.springframework.context.annotation.internalCommonAnnotationProcessorCommonAnnotationBeanPostProcessor
  6. 注册org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessorPersistenceAnnotationBeanPostProcessor
  7. 注册org.springframework.context.event.internalEventListenerProcessorEventListenerMethodProcessor
  8. 注册org.springframework.context.event.internalEventListenerFactoryDefaultEventListenerFactory

创建scannerhhh

  1. registerDefaultFilters 注册默认的扫描拦截
    • Component
    • ManagedBean
    • Named
  2. setEnvironment(environment) 赋予环境
  3. setResourceLoader(resourceLoader) 赋予资源加载器

register(annotatedClasses)

注册方法的配置类

doRegisterBean()

注册实际干活的方法

  1. ConditionEvaluator 鉴定Condition条件
    • 判断@Conditional
    • 获取Condition条件集合并进行排序
    • 循环判断上述Condition条件
  2. AnnotationConfigUtils.processCommonDefinitionAnnotations(abd)
    • @Lazy
    • @Primary
    • @DependsOn
    • @Role
    • @Description
  3. Qualifier进行处理PrimaryLazy以及其他
  4. BeanDefinitionCustomizer#customize BeanDefinition自定义器处理
  5. 注册BeanDefinitionHolderBeanDefinition

scan(basePackages)

扫描包路径

refresh()

据我们所知IOC容器的主要方法是通过refresh方法进行刷新启动,容器刷新创建

prepareRefresh()

准备容器的刷新工作

  1. 设置标志位closedactive

    1
    2
    this.closed.set(false);
    this.active.set(true);
  2. initPropertySources()

    初始化属性配置文件,未进行实现,需要子类自行实现

  3. getEnvironment().validateRequiredProperties()

obtainFreshBeanFactory()

告诉子类刷新内部的BeanFactory

  1. refreshBeanFactory()

    通过AtomicBoolean.compareAndSet(false, true)来控制一个BeanFactory,并设置一个序列化的ID值,若是需要的话,可以通过这个序列化ID来发序列化为BeanFactory

  2. 返回构造器初始化的BeanFactory

prepareBeanFactory(beanFactory)

上下文中准备使用的BeanFactory

  1. 赋值BeanClassLoader

  2. 赋值BeanExpressionResolverStandardBeanExpressionResolver

  3. 添加PropertyEditorRegistrarResourceEditorRegistrar

  4. 添加BeanPostProcessorApplicationContextAwareProcessor,实现Aware接口方法的赋值

    EnvironmentAwareEmbeddedValueResolverAwareResourceLoaderAwareApplicationEventPublisherAwareMessageSourceAwareApplicationContextAware

  5. 去掉上面的依赖接口,避免重复调用

  6. 注册依赖类BeanFactoryResourceLoaderApplicationEventPublisherApplicationContext

  7. 添加BeanPostProcessorApplicationListenerDetector 处理ApplicationListener事件监听

  8. 如果包含loadTimeWeaver这个Bean,添加对应的BeanPostProcessorLoadTimeWeaverAwareProcessor以及赋值TempClassLoaderContextTypeMatchClassLoader

  9. 注册环境信息的Bean

environmentStandardEnvironment

systemPropertiesgetEnvironment().getSystemProperties()

systemEnvironmentgetEnvironment().getSystemEnvironment()

postProcessBeanFactory(beanFactory)

子类在上下文中后置处理BeanFactory

invokeBeanFactoryPostProcessors(beanFactory)

调用BeanFactoryPostProcesser

PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());

后置处理器的委派处理类

  1. BeanDefinitionRegistry的处理
    • 处理上面添加的BeanFactoryPostProcessorBeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry(registry)
    • 获取BeanFatory中所有的BeanDefinitionRegistryPostProcessor
    • 实现PriorityOrdered的接口的BeanDefinitionRegistryPostProcessor排序并执行BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry(registry)
    • 实现Ordered的接口的BeanDefinitionRegistryPostProcessor排序并执行BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry(registry)
    • 剩下的BeanDefinitionRegistryPostProcessor排序并执行BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry(registry)
    • 执行所有的BeanDefinitionRegistryPostProcessor#postProcessBeanFactory(beanFactory)
    • 执行除BeanDefinitionRegistryPostProcessorBeanDefinitionRegistry#postProcessBeanFactory(beanFactory)
  2. 直接执行除BeanDefinitionRegistryPostProcessorBeanDefinitionRegistry#postProcessBeanFactory(beanFactory),与上述1互斥
  3. BeanFactoryPostProcessor的处理
    • 实现PriorityOrderedBeanFactoryPostProcessor排序并执行BeanFactoryPostProcessor.postProcessBeanFactory(beanFactory)
    • 实现OrderedBeanFactoryPostProcessor排序并执行BeanFactoryPostProcessor.postProcessBeanFactory(beanFactory)
    • 剩下的BeanFactoryPostProcessor执行BeanFactoryPostProcessor.postProcessBeanFactory(beanFactory)
    • 清除后置处理器可能改变的原元数据信息

重置了添加对应的BeanPostProcessorLoadTimeWeaverAwareProcessor以及赋值TempClassLoaderContextTypeMatchClassLoader

registerBeanPostProcessors(beanFactory)

注册拦截Bean创建的BeanPostProcessor

PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);

  1. 添加BeanPostProcessorBeanPostProcessorChecker
  2. 实现PriorityOrdered的除掉MergedBeanDefinitionPostProcessorBeanPostProcessor排序并进行注册
  3. 实现Ordered的除掉MergedBeanDefinitionPostProcessorBeanPostProcessor排序并进行注册
  4. 剩下的除掉MergedBeanDefinitionPostProcessorBeanPostProcessor进行注册
  5. MergedBeanDefinitionPostProcessor排序并注册
  6. 添加了一个BeanPostProcessorApplicationListenerDetector

initMessageSource()

初始化MessageSource

  1. 判断可有messageSourceBean
    • 有,判断当前messageSource是否是HierarchicalMessageSource,是的话赋值ParentMessageSource
    • 没有,注册messageSourceDelegatingMessageSource,并赋值ParentMessageSource

initApplicationEventMulticaster()

初始化ApplicationEvent派发器,注册applicationEventMulticasterSimpleApplicationEventMulticaster

onRefresh()

模板方法来添加上下文刷新工作,子类进行实现

registerListeners()

注册监听器

  1. ApplicationEvent派发器添加事件
  2. ApplicationEvent派发器添加事件Bean
  3. 派发早期处理事件

finishBeanFactoryInitialization(beanFactory)

完成BeanFactory的实例化

  1. 初始化ConversionService
  2. 注册EmbeddedValueResolver
  3. 初始化LoadTimeWeaverAware接口的Bean
  4. 完成非惰性加载的单实例Bean初始化
    • 触发非惰性加载的单实例Bean初始化getBean()
    • 若是SmartInitializingSingleton触发回调smartSingleton.afterSingletonsInstantiated()

getBean(beanName) – doGetBean()

获取Bean的实例

  1. FactoryBean中获取Bean

  2. 判断parentBeanFactory以及parentBeanFactory包含当前Bean,从parentBeanFactory进行获取

  3. 循环获取DependsOn的Bean

  4. 创建BeancreateBean(beanName, mbd, args)

    • 准备方法的覆盖重写 – prepareMethodOverrides()

    • 尝试让BeanPostProcessor返回一个代理BeanresolveBeforeInstantiation(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

  5. 检查必须的类型是否匹配

finishRefresh()

  1. clearResourceCaches(); 清楚资源缓存

  2. initLifecycleProcessor() 初始化LifecycleProcessor

    注册lifecycleProcessor–DefaultLifecycleProcessor

  3. getLifecycleProcessor().onRefresh()调用LifecycleProcessor#onRefresh()方法

  4. 发布ContextRefreshedEvent

  5. LiveBeansView注册ApplicationContext


Spring 注解编程IOC源码
http://example.com/2018/10/18/Spring/Spring 注解编程 IOC源码/
作者
FelixFly
发布于
2018年10月18日
许可协议