zoukankan      html  css  js  c++  java
  • Spring Boot 扩展分析

           前面的章节在分析SpringBoot启动过程中,我们发现SpringBoot使用Spring框架提供的SpringFactoriesLoader这个类,实现检索META-INF/spring.factories配置文件,并从配置文件中获取指定配置项(通常是特定的接口实现类),并实例化后加载到Spring容器,这个机制为SpringBoot提供了方便的扩展工能。下面列举几个扩展点逐一说明扩展方式:

    扩展ApplicationContextInitializer接口

    ApplicationContextInitializer这个接口的功能主要是在Spring应用上下文(ConfigurableApplicationContext)执行refresh之前调用,官方文档中的描述是“通常被用作web应用,在一些程序设计在spring容器初始化使用。比如说注册一些熟悉配置或者激活一些配置文件针对(ConfigurableApplicationContext的getEnvironment()方法)”,扩展这个接口可以实现一些额外的处理。

    扩展代码如下,只需要实现接口中的initialize()方法即可,并将该实例添加到容器中:

    1 @Order(1)
    2 public class ApplicationContextInitializerTest implements org.springframework.context.ApplicationContextInitializer<ConfigurableApplicationContext> {
    3     @Override
    4     public void initialize(ConfigurableApplicationContext applicationContext) {
    5 
    6         System.out.println("这里是自定义ApplicationContextInitializer,可以用来操作applicationContext");
    7 
    8     }
    9 }

    可以通过下面任一中方式添加到Spring容器中:

    • 直接在SpringBoot入口main函数中添加application.addInitializers(new ApplicationContextInitializerTest());
    • 通过在application.properties中添加配置项:
    context.initializer.class=com.sl.springbootdemo.extendsion. ApplicationContextInitializerTest

       如果扩展了多个Initialize则可以通过逗号分隔(为什么可以这么配置可以查看springboot jar包提供的类:DelegatingApplicationContextInitializer)

    • 之前分析SpringBoot启动过程,我们知道SpringBoot启动时会读取META-INF/spring.factories中的配置项,那么自定义的Initialize也通过在项目自定义的META-INF/spring.factories文件中注册
     org.springframework.context.ApplicationContextInitializer=
     com.sl.springbootdemo.extendsion. ApplicationContextInitializerTest

    扩展CommandLineRunner或者ApplicationRunner接口

    CommandLineRunner、ApplicationRunner 接口的功能是在容器启动成功后的最后一步调用,分析过源码可以知道有个callrunners()方法,这两个接口是SpringBoot框架提供,两个接口的区别也只是参数类型不同。

    扩展CommandLineRunner:

    1 @Order(2)
    2 @Component
    3 public class CommandLineRunnerTest implements CommandLineRunner {
    4     @Override
    5     public void run(String... args) throws Exception {
    6         System.out.println("扩展CommandLineRunner,打印出来看看");
    7     }
    8 }

    扩展ApplicationRunner:

    @Order(3)
    @Component
    public class ApplicationRunnerTest implements ApplicationRunner {
    
        //ApplicationArguments是对参数(main方法)做了进一步封装
        @Override
        public void run(ApplicationArguments args) throws Exception {
    
            System.out.println("===MyApplicationRunner==="+ Arrays.asList(args.getSourceArgs()));
            System.out.println("===getOptionNames========"+args.getOptionNames());
            System.out.println("===getOptionValues======="+args.getOptionValues("name"));
            System.out.println("==getOptionValues========"+args.getOptionValues("password"));
    
        }
    }

    扩展ApplicationListener

    监听器的扩展可以参考上一章:Spring Boot(六)自定义事件及监听

    自定义Banner

    Banner修不修该本身并没什么意义,SpringBoot启动的时候会打印出一个很丑的“SPRING”几个大字母,如下:

    • 关闭Banner

    在SpringBoot入口main函数中加入如下代码即可关闭打印Banner

      springApplication.setBannerMode(Banner.Mode.OFF);
    • 修改Banner

    在SpringBoot项目resources目录下新建一个banner.txt文件,再次启动将会打印banner.txt中的内容,文本中尽管放一些天马行空的内容好了。

    比如下面这样的就比较中国风:

  • 相关阅读:
    Linux
    python中元类
    POJ 1182 食物链
    POJ 1733 Parity game
    top 介绍
    周记 2014.8.31
    windows10配置python
    oracle执行update时卡死问题的解决办法
    An Easy Introduction to CUDA C and C++
    super()
  • 原文地址:https://www.cnblogs.com/ashleyboy/p/9567854.html
Copyright © 2011-2022 走看看