返回顶部
首页 > 资讯 > 精选 >springboot ApplicationContextInitializer的三种使用方法是怎样的
  • 297
分享到

springboot ApplicationContextInitializer的三种使用方法是怎样的

2023-06-25 15:06:35 297人浏览 八月长安
摘要

SpringBoot ApplicationContextInitializer的三种使用方法是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。ApplicationCon

SpringBoot ApplicationContextInitializer的三种使用方法是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

    ApplicationContextInitializer的三种使用方法

    概述

    ApplicationContextInitializer是在springboot启动过程(refresh方法前)调用,主要是在ApplicationContextInitializer中initialize方法中拉起了ConfigurationClassPostProcessor这个类(我在springboot启动流程中有描述),通过这个processor实现了beandefinition。

    言归正传,ApplicationContextInitializer实现主要有3中方式:

    1、使用spring.factories方式

    首先我们自定义个类实现了ApplicationContextInitializer,然后在resource下面新建/META-INF/spring.factories文件。

     public class Demo01ApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {    @Override    public void initialize(ConfigurableApplicationContext configurableApplicationContext) {        System.out.println("user add method ==> ApplicationContextInitializer");    }}

    springboot ApplicationContextInitializer的三种使用方法是怎样的

    springboot ApplicationContextInitializer的三种使用方法是怎样的

    这个加载过程是在SpringApplication中的getSpringFactoriesInstances()方法中直接加载并实例后执行对应的initialize方法。代码如下:

    private <T> Collection<? extends T> getSpringFactoriesInstances(Class<T> type,Class<?>[] parameterTypes, Object... args) {ClassLoader classLoader = Thread.currentThread().getContextClassLoader();// Use names and ensure unique to protect against duplicatesSet<String> names = new LinkedHashSet<String>(SpringFactoriesLoader.loadFactoryNames(type, classLoader));List<T> instances = createSpringFactoriesInstances(type, parameterTypes,classLoader, args, names);AnnotationAwareOrderComparator.sort(instances);return instances;}

    2、application.properties添加配置方式

    对于这种方式是通过DelegatingApplicationContextInitializer这个初始化类中的initialize方法获取到application.properties中context.initializer.classes对应的类并执行对应的initialize方法。

    只需要将实现了ApplicationContextInitializer的类添加到application.properties即可。如下:

    springboot ApplicationContextInitializer的三种使用方法是怎样的

    下面我们看看DelegatingApplicationContextInitializer是如何加载的。看代码:

    private static final String PROPERTY_NAME = "context.initializer.classes";
    private List<Class<?>> getInitializerClasses(ConfigurableEnvironment env) {String classNames = env.getProperty(PROPERTY_NAME);List<Class<?>> classes = new ArrayList<Class<?>>();if (StringUtils.hasLength(classNames)) {for (String className : StringUtils.tokenizeToStringArray(classNames, ",")) {classes.add(getInitializerClass(className));}}return classes;}

    是从配置文件中获取到对应的初始化类信息,然后执行初始化方法。

    3、直接通过add方法

    这个方法就比较简单,直接在springboot启动的时候,add一个实现了ApplicationContextInitializer的类即可,代码如下:

    @SpringBootApplicationpublic class InitializerDemoApplication { public static void main(String[] args) {//type01SpringApplication springApplication = new SpringApplication(InitializerDemoApplication.class);springApplication.addInitializers(new Demo01ApplicationContextInitializer());springApplication.run(args); //SpringApplication.run(InitializerDemoApplication.class,args);}}

    以上3中方法都可以实现自定义的Initializer,只不过执行的顺序有差异。这里我比较感兴趣有2个,一个通过spring.factories实现SPI模式,有兴趣的可以看下jdbc-starter等一些相关springboot starter。

    第二个就是作为一个钩子去拉起来"一坨"的bean。

    ApplicationContextInitializer都干了些什么

    初始化方法

    org.springframework.boot.context.config.DelegatingApplicationContextInitializer

     @Override public void initialize(ConfigurableApplicationContext context) {  ConfigurableEnvironment environment = context.getEnvironment();    List<Class<?>> initializerClasses = getInitializerClasses(environment);  if (!initializerClasses.isEmpty()) {   applyInitializerClasses(context, initializerClasses);  } }

    也就是说没有定义的话,就不会初始化了。

    org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer

     @Override public void initialize(ConfigurableApplicationContext applicationContext) {    applicationContext.addBeanFactoryPostProcessor(new CachingMetadataReaderFactoryPostProcessor()); }

    org.springframework.boot.context.ContextIdApplicationContextInitializer

     @Override public void initialize(ConfigurableApplicationContext applicationContext) {  ContextId contextId = getContextId(applicationContext);  applicationContext.setId(contextId.getId());    applicationContext.getBeanFactory().reGISterSingleton(ContextId.class.getName(), contextId); }

    org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer

     @Override public void initialize(ConfigurableApplicationContext context) {    context.addBeanFactoryPostProcessor(new ConfigurationWarningsPostProcessor(getChecks())); }

    org.springframework.boot.rSocket.context.RSocketPortInfoApplicationContextInitializer

     @Override public void initialize(ConfigurableApplicationContext applicationContext) {     applicationContext.addApplicationListener(new Listener(applicationContext)); }

    org.springframework.boot.WEB.context.ServerPortInfoApplicationContextInitializer

     @Override public void initialize(ConfigurableApplicationContext applicationContext) {    applicationContext.addApplicationListener(this); }

    org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener

     @Override 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   // 注册一个监听ApplicationEvent事件的监听器用于打印自动配置后的日志信息   this.report = ConditionEvaluationReport.get(this.applicationContext.getBeanFactory());  } }

    所有的这些初始化类都没偶进行启动服务的实质性操作,都是通过注册对象,埋点,后面invokeBeanFactoryPostProcessors才真正调用初始化方法,而且在项目启动之前

    看完上述内容,你们掌握springboot ApplicationContextInitializer的三种使用方法是怎样的的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

    --结束END--

    本文标题: springboot ApplicationContextInitializer的三种使用方法是怎样的

    本文链接: https://lsjlt.com/news/305794.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • springboot ApplicationContextInitializer的三种使用方法是怎样的
      springboot ApplicationContextInitializer的三种使用方法是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。ApplicationCon...
      99+
      2023-06-25
    • springboot ApplicationContextInitializer的三种使用方法小结
      目录ApplicationContextInitializer的三种使用方法概述1、使用spring.factories方式2、application.properties添加配置方...
      99+
      2024-04-02
    • Java中List排序的三种实现方法是怎样的
      Java中List排序的三种实现方法是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前言在某些特殊的场景下,我们需要在 Java 程序中对 List 集合...
      99+
      2023-06-22
    • css3的三种使用方法分别是什么
      这篇文章给大家介绍css3的三种使用方法分别是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。css3的三种使用方法:1、内联样式,语法为“<元素 style="cs...
      99+
      2024-04-02
    • CSS的三种使用方法介绍
      本篇内容介绍了“CSS的三种使用方法介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!这里和大家分享一下应...
      99+
      2024-04-02
    • CSS的三种样式怎么定义使用
      本篇内容介绍了“CSS的三种样式怎么定义使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!CSS样式分为:...
      99+
      2024-04-02
    • MySQL的三种安装方式与版本是怎样的
      这篇文章将为大家详细讲解有关MySQL的三种安装方式与版本是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 MYSQL版本介绍 mysql分alp...
      99+
      2024-04-02
    • mybatis foreach 属性及其三种使用情况是怎样的
      这篇文章主要为大家分析了mybatis foreach 属性及其三种使用情况是怎样的的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“myb...
      99+
      2023-06-26
    • 以单用户模式启动CentOS/RHEL 7/8 的三种方法是怎样的
      以单用户模式启动CentOS/RHEL 7/8 的三种方法是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。单用户模式,也被称为维护模式,超级用户可以在此模式下恢复/修...
      99+
      2023-06-16
    • SpringBoot利用jackson格式化时间的三种方法
      前言 在实际开发中我们经常会与时间打交道,那这就会涉及到一个时间格式转换的问题。接下来会介绍几种在SpirngBoot中如何对时间格式进行转换。 准备工作 创建项目,添加依赖 ...
      99+
      2024-04-02
    • 详解SpringBoot禁用Swagger的三种方式
      目录摘要方法禁用方法1:禁用方法2:禁用方法3:摘要 在生产环境下,我们需要关闭swagger配置,避免暴露接口的这种危险行为。 方法 禁用方法1: 使用注解 @Value() 推荐...
      99+
      2024-04-02
    • redo的三种状态的恢复是怎样的
      这期内容当中小编将会给大家带来有关redo的三种状态的恢复是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。CURRENT (1)如果有归档和备份,可以用不完全恢复...
      99+
      2024-04-02
    • Git的使用方法是怎么样的
      这篇文章将为大家详细讲解有关Git的使用方法是怎么样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在傻瓜式部署方式出现问题之后,我们该通过什么方法搭建网站呢?其实京东云擎本身已经给出了答案...
      99+
      2023-06-10
    • CSS的三种样式是什么
      本篇内容介绍了“CSS的三种样式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!   内联式css样...
      99+
      2024-04-02
    • MySQL到CSV几种方法是怎样的
      MySQL到CSV几种方法是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。数据的导出导入,最常用的方法:导出:省资源型:mysql -e...
      99+
      2024-04-02
    • JavaScript的三种BOM对象分别是怎样的
      这篇文章将为大家详细讲解有关JavaScript的三种BOM对象分别是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。window 对象给我们提供了一个 location 属性用于获取或...
      99+
      2023-06-21
    • Android中使用定时器的三种方法
      本文实例为大家分享了Android中使用定时器的三种方法,供大家参考,具体内容如下 图示: 因为都比较简单,所以就直接贴代码(虑去再次点击停止的操作),有个全局的Handle...
      99+
      2022-06-06
      方法 定时器 Android
    • 使用java判断质数的三种方法
      方法一:质数只能被1和它本身整除 import java.util.Scanner;public class Test { public static void main(String[] args) { int ...
      99+
      2023-08-31
      java 开发语言 蓝桥杯
    • 详解SpringBoot静态方法获取bean的三种方式
      目录方式一 注解@PostConstruct方式二 启动类ApplicationContext方式三手动注入ApplicationContext方式一 ...
      99+
      2024-04-02
    • springboot项目启动后执行方法的三种方式
      目录1 方法方法1:spring的ApplicationListener< ContextRefreshedEvent>接口方法2:springboot的Applicat...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作