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

  • 相关阅读:
    生产者消费者模型
    查看网络通不通的几种方法
    tomcat在45秒内没有启动,启动超时
    request获取各种路径
    修改web项目发布路径
    web.xml不同版本的头
    Web.xml 错误或异常页面配置
    ModelAndView command
    java初始化顺序
    初始化时的过程
  • 原文地址:https://www.cnblogs.com/nangonghui/p/15561298.html
Copyright © 2011-2022 走看看