Spring源码学习

源码学习

前提

版本:5.3.10
形式:注册形式-AnnotationConfigApplicationContext(AppConfig.class)

学习内容

spring启动注册过程

Spring源码学习_第1张图片

Spring源码学习_第2张图片

this() 阶段

Spring源码学习_第3张图片

  1. 创建AnnotationConfigApplicationContext实例
    1. 创建AnnotatedBeanDefinitionReader实例
      默认注册几个注解相关的bean后置处理器-注册到beanDefinitionMap
      ConfigurationClassPostProcessor
      AutowiredAnnotationBeanPostProcessor
      CommonAnnotationBeanPostProcessor
      EventListenerMethodProcessor
      DefaultEventListenerFactory
    2. 创建ClassPathBeanDefinitionScanner实例

register(componentClasses);

  1. 注册配置类-存入beanDefinitionMap;

refresh();

  1. prepareRefresh();

    准备开始注册前的一些属性
    1、比如active、startupDate 属性复制
    2、initPropertySources();执行子类扩展方法
    3、检查必须的环境变量    
    4、初始化earlyApplicationListeners和earlyApplicationEvents 属性;

  2. obtainFreshBeanFactory();

    获取一个刷新的beanFactory-》其refresh设置为true 对后续的功能可能有影响。                                

  3. prepareBeanFactory()

     准备BeanFactory 

    1、添加注册器ApplicationContextAwareProcessor 用于处理实现xxxAware接口的bean --- 备注:重点功能,后续可在自定义的bean中直接获取使用以下类中给的属性

    EnvironmentAware
    EmbeddedValueResolverAware
    ResourceLoaderAware
    ApplicationEventPublisherAware
    ApplicationContextAware
    MessageSourceAware
    ApplicationStartupAware

    2、使用 ignoreDependencyInterface() 将上面这些类不能通过属性方式自动注入(但可以通过 @Autowire注入)

    3、使用 registerResolvableDependency()将下面的这些类设置为不能用getbean()获取到但可以使用@autowire注入:

    BeanFactory
    ResourceLoader
    ApplicationEventPublisher
    ApplicationContext

    4、添加ApplicationListenerDetector bean后置处理器;用于探测ApplicationListener类型的bean注册到ApplicationContact中

    5、直接使用registerSingleton()方法将以下类注册到容器单例池singletonObjects中

    environment  
    systemProperties
    systemEnvironment
    applicationStartup
  4. postProcessBeanFactory(beanFactory)

    子类扩展;

  5. invokeBeanFactoryPostProcessors(beanFactory);  
    1、从beanDefinitionNames中遍历获得BeanDefinitionRegistryPostProcessor类型bean名称--->这里默认就一个:ConfigurationClassPostProcessor
    2、从manualSingletonNames中遍历获得BeanDefinitionRegistryPostProcessor类型的bean名称-->无
    3、获取所得到的BeanDefinitionRegistryPostProcessor进行注册并添加到currentRegistryProcessors中,供后续使用【以下是注册bean对象的步骤(这里就已ConfigurationClassPostProcessor为例)】
    执行doGetBean()方法进行注册internalConfigurationAnnotationProcessor:
    1、从singletonObjects中获取当前注册的bean是否存在
    2、markBeanAsCreated(beanName) //标记当前bean为创建中-->alreadyCreated
    3、getMergedLocalBeanDefinition(beanName); //获取去bean定义,并进行相应的处理
    4、String[] dependsOn = mbd.getDependsOn(); //获取当前beanName所依赖的,当前Bean创建之前dependsOn所依赖的Bean必须已经创建好了
    5、createBean(beanName, mbd, args);//创建bean
    5.1、resolveBeanClass(mbd, beanName); //确保bean定义被加载了
    5.2、resolveBeforeInstantiation(beanName, mbdToUse); //实例化前执行
    5.2.1、hasInstantiationAwareBeanPostProcessors();判断如果存在InstantiationAwareBeanPostProcessor类型的bean处理器,则执行postProcessBeforeInstantiation()方法做自定义实例化前处理
    5.3、doCreateBean(beanName, mbdToUse, args);
    5.3.1、createBeanInstance(beanName, mbd, args);//创建实例
    5.3.1.1、determineConstructorsFromBeanPostProcessors(beanClass, beanName);//获取构造方法
    5.3.1.2、instantiateBean(beanName, mbd);//上述没有获取到指定构造方法,则使用默认的构造实例化 
    5.3.1.2.1、getInstantiationStrategy();//初始化策略默认是CglibSubclassingInstantiationStrategy; this()阶段实例化AbstractAutowireCapableBeanFactory时默认写入的
    5.3.1.2.2、instantiate(mbd, beanName, this);//执行实例化返回实例
    5.3.2、applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);//执行beanPostProcess.postProcessMergedBeanDefinition();【备注:当前的bean处理器必须是MergedBeanDefinitionPostProcessor的实现】,默认情况下只有先前注册的ApplicationListenerDetector处理器,来探测监听器bean
    5.3.3、addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean)); 将并添加到三级缓存-处理循环依赖 singletonFactories--Map、registeredSingletons --Set两个都要放
    5.3.4、populateBean(beanName, mbd, instanceWrapper);//属性填充
    5.3.4.1、执行bean后置处理器方法postProcessAfterInstantiation()【InstantiationAwareBeanPostProcessor类型】
    5.3.4.2、执行bean后置处理器方法postProcessProperties()【InstantiationAwareBeanPostProcessor类型】:这里主要会发生依赖注入的处理例如@Autowired
    5.3.5、initializeBean(beanName, exposedObject, mbd);//初始化
    5.3.5.1、invokeAwareMethods(beanName, bean); //执行Aware的方法【备注:如果当前bean有实现,则会执行赋予某种功能:BeanNameAware、BeanClassLoaderAware、BeanFactoryAware】
    5.3.5.2、applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);//执行beanPostPrecess.postProcessBeforeInitialization()方法,所有的【备注:这里会有Aware功能的处理,在this()阶段特殊处理的那几个Aware接口例如:EnvironmentAware等就在这里执行ApplicationContextAwareProcessor的postProcessBeforeInitialization()方法时进行处理】。
    5.3.5.3、invokeInitMethods(beanName, wrappedBean, mbd);//初始化
    5.3.5.3.1、如果当前bean有实现InitializingBean接口,则执行afterPropertiesSet()方法
    5.3.5.3.2、如果有设置initMethod则执行该方法
    5.3.5.4、applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);//执行所有beanPostPrecess的postProcessAfterInitialization()方法。
    6、addSingleton(beanName, singletonObject);//添加到单例池 singletonObjects、registeredSingletons中
    
    
    4、invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());  //执行当前注册处理器的postProcessor.postProcessBeanDefinitionRegistry(registry);方法来获得更多的bean定义【重点】
     
    1、执行ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry().processConfigBeanDefinitions(registry): 解析配置类扫描满足的bean定义注册到beanDefinitionMap中
    
    2、invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);执行ConfigurationClassPostProcessor.postProcessBeanFactory(beanFactory);方法
    2.1、enhanceConfigurationClasses(beanFactory);// 增强配置类,代理加了Configuration注解的配置类
    2.2、beanFactory.addBeanPostProcessor(new ImportAwareBeanPostProcessor(beanFactory));//添加一个BeanPostProcessor;
    3、invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory); // 执行手动添加的普通BeanFactoryPostProcessor的postProcessBeanFactory()方法
    
    4、执行扫描出来的【满足bean定义的但没注册到单例池中的bean定义】普通BeanFactoryPostProcessor注册到单例池中		
    4.1、讲注册的bean后置处理器分为:priorityOrderedPostProcessors【实现 PriorityOrdered.class的】、orderedPostProcessorNames【实现 Ordered.class的】、nonOrderedPostProcessorNames【其余的】
    4.2、依次执行beanPostProcessor.postProcessBeanFactory();priorityOrderedPostProcessors、nonOrderedPostProcessorNames、nonOrderedPostProcessors;
    


     
  6. registerBeanPostProcessors(beanFactory);

    1、 beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);//获取bean定义中的的BeanPostProcess类型定义进行划分成priorityOrderedPostProcessors【实现 PriorityOrdered.class的】、orderedPostProcessorNames【实现 Ordered.class的】、nonOrderedPostProcessorNames【其余的】

    2、并将这些beanPostProcessor注册到beanFactory中beanFactory.addBeanPostProcessor(postProcessor);

  7. initMessageSource();
    设置ApplicationContext的MessageSource,要么是用户设置的,要么是DelegatingMessageSource
  8. initApplicationEventMulticaster();

    1、注册applicationEventMulticaster多播器,来支持监听器功能,默认SimpleApplicationEventMulticaster

  9. onRefresh();

    1、给子类的扩展点,可已注册特殊的类等。

  10. registerListeners();

    1、把定义的ApplicationListener的Bean对象,设置到ApplicationContext中去,并执行在此之前所发布的事件

  11. finishBeanFactoryInitialization(beanFactory);

    1、实例化所有在beanDefinitionMap中单还没有实例化到单例池中的没有@Lazy的bean.

  12. finishRefresh();

    1、clearResourceCaches();//删除context层resource缓存

    2、initLifecycleProcessor()//初始化lifecycleProcessor的bean默认为:DefaultLifecycleProcessor;

    3、publishEvent(new ContextRefreshedEvent(this));//发布ContextRefreshedEvent事件。表示容器初始化完毕可监听该事件启动自己需要的监听器,spring默认会触发ScheduledAnnotationBeanPostProcessor来开启定时任务。

附件:看到这里的同学应该很少吧,这里总结了一份启动的脑图(文章开头图片的脑图),看起来会更清晰些:点击查看

你可能感兴趣的:(spring,java,学习,spring)