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解析过程中,对配置化类的解析、扫描包路径解析发挥了作用。

  • 相关阅读:
    【Python】自己写日志功能
    shell 笔记
    python 字典,字典嵌套,字典遍历
    python基础 循环,列表,切片,列表增删改查
    Dva_react使用问题总结
    ts_react_test报错解决方法
    如何写好项目规划和方案设计文档 (转)
    script标签引入react环境三个必须cdn文件
    react点击事件对象( react封装过后事件对象 )
    react简书笔记一 环境, git 和 项目 关联
  • 原文地址:https://www.cnblogs.com/nangonghui/p/15561298.html
Copyright © 2011-2022 走看看