用于在spring容器刷新之前初始化SpringConfigurableApplicationContext的回调接口;它通常用于需要以编程方式初始化应用程序上下文(实现Ordered接口,或添加@OrderAnnotation)的Web应用程序用法自定义ApplicationContextInitializer接口的实现类并实现逻辑有两种用法。使用SpringApplication.addInitializers添加新定义的Initializer。自定义ApplicationContextInitializer接口的实现类,实现逻辑。然后自定义spring.factories,新增一行自己的配置。使用demo源码https://github.com/JZue/sprin...module:demo_applicationcontextinitializer源码分析spring.factories相关配置什么时候获取?SpringApplication.class的构造函数,这一行setInitializers((Collection)getSpringFactoriesInstances(ApplicationContextInitializer.class));什么时候执行相关代码逻辑?SpringApplication.run的prepareContext(刷新应用程序上下文之前的准备阶段)查看publicConfigurableApplicationContextrun(String...args){...context=createApplicationContext();//实例化SpringBootExceptionReporter.class以支持报告启动错误exceptionReporters=getSpringFactoriesInstances(SpringBootExceptionReporter.class,newClass[]{ConfigurableApplicationContext.class},context);//刷新应用上下文前的准备阶段prepareContext(context,environment,listeners,applicationArguments,printedBanner);//5、刷新应用上下文refreshContext(context);//刷新应用上下文后的扩展接口afterRefresh(context,applicationArguments);//计时停止stopWatch.stop();如果(this.logStartupInfo){newStartupInfoLogger(this.mainApplicationClass)。logStarted(getApplicationLog(),秒表);}//发布容器启动和完成事件listeners.started(context);callRunners(上下文,applicationArguments);...}prepareContext方法privatevoidprepareContext(ConfigurableApplicationContextcontext,ConfigurableEnvironmentenvironment,SpringApplicationRunListenerslisteners,ApplicationArgumentsapplicationArguments,BannerprintedBanner){//设置容器环境context.setEnvironment(environment);//后处理应用程序上下文(上下文);//执行容器中的ApplicationContextInitializer包括springfactories和applyInitializers(context)三种方式自定义;...}执行方法:applyInitializersprotectedvoidapplyInitializers(ConfigurableApplicationContextcontext){//for循环执行for(ApplicationContextInitializerinitializer:getInitializers()){Class>requiredType=GenericTypeResolver.resolveTypeArgument(initializer.getClass(),ApplicationContextInitializer.class);Assert.isInstanceOf(requiredType,context,“无法调用初始值设定项。”);initializer.initialize(上下文);发布!
