博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Boot中的initializers的作用分析
阅读量:6732 次
发布时间:2019-06-25

本文共 3712 字,大约阅读时间需要 12 分钟。

在SpringApplication的实例属性中有一个初始器的属性:List<ApplicationContextInitializer<?>> initializers ,这些初始化器(initializers)是Spring Boot通过读取每个jar包下的/META-INF/spring.factories文件中的配置获取的。每一个initailizer都是一个实现了ApplicationContextInitializer接口的实例。ApplicationContextInitializer是Spring IOC容器中提供的一个接口:

package org.springframework.context;public interface ApplicationContextInitializer
{ /** * Initialize the given application context. * @param applicationContext the application to configure */ void initialize(C applicationContext);}
ApplicationContextInitializer是一个回调接口,它会在ConfigurableApplicationContext的refresh()方法调用之前被调用,做一些容器的初始化工作。这一点我们也可以通过SpringApplication的实例run方法的实现代码得到验证,为了说明问题,再次贴一下这段代码,注意下标红的代码和注释就自然理解了。
public ConfigurableApplicationContext run(String... args) {        StopWatch stopWatch = new StopWatch();        stopWatch.start();        ConfigurableApplicationContext context = null;        FailureAnalyzers analyzers = null;        configureHeadlessProperty();        SpringApplicationRunListeners listeners = getRunListeners(args);        listeners.starting();        try {            ApplicationArguments applicationArguments = new DefaultApplicationArguments(                    args);            ConfigurableEnvironment environment = prepareEnvironment(listeners,                    applicationArguments);            Banner printedBanner = printBanner(environment);            context = createApplicationContext();            analyzers = new FailureAnalyzers(context);            prepareContext(context, environment, listeners, applicationArguments,                    printedBanner); // prepareContext方法中将会执行每个initializers的逻辑            refreshContext(context);  // 执行bean的创建和实例化            afterRefresh(context, applicationArguments);            listeners.finished(context, null);            stopWatch.stop();            if (this.logStartupInfo) {                new StartupInfoLogger(this.mainApplicationClass)                        .logStarted(getApplicationLog(), stopWatch);            }            return context;        }        catch (Throwable ex) {            handleRunFailure(context, listeners, analyzers, ex);            throw new IllegalStateException(ex);        }    }

 

SpringBoot默认情况下提供了6个initializer,分别由2个jar提供:

 spring-boot-1.5.2.RELEASE.jar

  •   org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer,
  •   org.springframework.boot.context.ContextIdApplicationContextInitializer,
  •   org.springframework.boot.context.config.DelegatingApplicationContextInitializer,
  •   org.springframework.boot.context.embedded.ServerPortInfoApplicationContextInitializer

  

   spring-boot-autoconfigure-1.5.2.RELEASE.jar

  •   org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,
  •   org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer

 

 Spring Boot对initializer的获取过程如下:

initialize(Object[] sources)

  -->(Collection) getSpringFactoriesInstances( ApplicationContextInitializer.class ))  //获取initializer实例
      -->SpringFactoriesLoader.loadFactoryNames(type, classLoader))
      -->createSpringFactoriesInstances(type, parameterTypes,classLoader, args, names)
        -->Constructor<?> constructor = instanceClass.getDeclaredConstructor(parameterTypes)
        -->T instance = (T) BeanUtils.instantiateClass(constructor, args)
      -->AnnotationAwareOrderComparator.sort(instances)

       --> setInitializers(Collection<? extends ApplicationContextInitializer<?>> initializers)

   -->this.initializers = new ArrayList<ApplicationContextInitializer<?>>();

   -->this.initializers.addAll(initializers);    //存入List<ApplicationContextInitializer<?>> initializers

 

转载于:https://www.cnblogs.com/hzhuxin/p/7742365.html

你可能感兴趣的文章
如何调整实例恢复时间
查看>>
SliverLight 之Sample
查看>>
你的吻
查看>>
bash算数运算&命令引用
查看>>
磁盘分区
查看>>
.net core 上传excel文件
查看>>
公有云时代的售前打单
查看>>
WINDOWS 2008 R2 HYPER-V集群宿主机蓝屏
查看>>
[Unity Shader] Shader学习笔记2 - 概述2
查看>>
磁盘阵列 RAID
查看>>
10.16/10.17/10.18 iptables nat表应用
查看>>
布尔类型传递参数
查看>>
使用SSH密钥对给你的阿里云ECS加把安全锁
查看>>
为什么选择Java Web做为学习方向
查看>>
org.apache.ibatis.builder.IncompleteElementException: Could not find parameter map java.util.Set
查看>>
NAT模式下CentOS7.X配置IP
查看>>
高盛报告:未来5-10年区块链将被广泛应用【附下载】
查看>>
java的排序算法
查看>>
java B2B2C Springcloud电子商务平台源码-eureka集群整合config配置中心
查看>>
网站安全检测之逻辑漏洞检测 修复方案
查看>>