zoukankan      html  css  js  c++  java
  • SpringBoot启动过程中,BeanFactoryPostProcessor注册时机

    SpringBoot在启动的时候,调用了run方法,在调用SpringApplication的 prepareContext()方法时候,调用了applyInitializers(context)应用初始化方法,applyInitializers(context)方法中,通过获取初始化对象,进行初始化过程,其中initializers中包含多个initializers对象

    0 = {DelegatingApplicationContextInitializer@3480} 
    1 = {SharedMetadataReaderFactoryContextInitializer@3442} 
    2 = {ContextIdApplicationContextInitializer@3481} 
    3 = {ConfigurationWarningsApplicationContextInitializer@3482} 
    4 = {RSocketPortInfoApplicationContextInitializer@3483} 
    5 = {ServerPortInfoApplicationContextInitializer@3484} 
    6 = {ConditionEvaluationReportLoggingListener@3485} 
    
    点击查看代码
    	protected void applyInitializers(ConfigurableApplicationContext context) {
    		for (ApplicationContextInitializer initializer : getInitializers()) {
    			Class<?> requiredType = GenericTypeResolver.resolveTypeArgument(initializer.getClass(),
    					ApplicationContextInitializer.class);
    			Assert.isInstanceOf(requiredType, context, "Unable to call initializer.");
    			initializer.initialize(context);
    		}
    	}
    
    然后调用了initialize(ConfigurableApplicationContext applicationContext) 方法,构建 BeanFactoryPostProcessor后置处理器CachingMetadataReaderFactoryPostProcessor,其中CachingMetadataReaderFactoryPostProcessor是SharedMetadataReaderFactoryContextInitializer的一个内部类,并添加到beanFactoryPostProcessors list对象中,接着继续执行其他初始化动作。ConfigurationWarningsApplicationContextInitializer初始化添加了一个ConfigurationWarningsPostProcessor BeanFactoryPostProcessor后置处理器
    class SharedMetadataReaderFactoryContextInitializer{
     	public void initialize(ConfigurableApplicationContext applicationContext) {
       	BeanFactoryPostProcessor postProcessor = new CachingMetadataReaderFactoryPostProcessor(applicationContext);
       	applicationContext.addBeanFactoryPostProcessor(postProcessor);
       }
    }
    
    public class ContextIdApplicationContextInitializer{
       public void initialize(ConfigurableApplicationContext applicationContext) {
       	ContextId contextId = getContextId(applicationContext);
       	applicationContext.setId(contextId.getId());
       	applicationContext.getBeanFactory().registerSingleton(ContextId.class.getName(), contextId);
       }
    }
    
    public class ConfigurationWarningsApplicationContextInitializer{
       @Override
       public void initialize(ConfigurableApplicationContext context) {
       	context.addBeanFactoryPostProcessor(new ConfigurationWarningsPostProcessor(getChecks()));
       }
    }
    public class RSocketPortInfoApplicationContextInitializer{
       @Override
       public void initialize(ConfigurableApplicationContext applicationContext) {
       	applicationContext.addApplicationListener(new Listener(applicationContext));
       }
    }
    
    public class ServerPortInfoApplicationContextInitializer{
       public void initialize(ConfigurableApplicationContext applicationContext) {
       	applicationContext.addApplicationListener(this);
       }
    }
    
    public class ConditionEvaluationReportLoggingListener{
       public void initialize(ConfigurableApplicationContext applicationContext) {
       	this.applicationContext = applicationContext;
       	applicationContext.addApplicationListener(new ConditionEvaluationReportListener());
       	if (applicationContext instanceof GenericApplicationContext) {
       		// Get the report early in case the context fails to load
       		this.report = ConditionEvaluationReport.get(this.applicationContext.getBeanFactory());
       	}
       }
    }
    

    其中在初始化过程中,添加到两个工厂后置处理器在后面的BeanDefinition解析过程中,对配置化类的解析、扫描包路径解析发挥了作用。

  • 相关阅读:
    JVM入门(一)
    2017目标
    2016目标
    C语言--第0次作业
    Hibernate ORM框架——续第一章:对象在Hibernate中的状态
    Hibernate ORM框架——续第一章:Java增删改查与Hibernate的增删改查的对比
    Hibernate ORM框架——续第一章:Hibernate的增删改查(第一个hibernate代码的优化)
    Hibernate ORM框架——第一章:Hibernate简介与操作基础
    改善SQL语句
    SQL Server的聚集索引和非聚集索引
  • 原文地址:https://www.cnblogs.com/nangonghui/p/15561298.html
Copyright © 2011-2022 走看看