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

扩展ApplicationContextInitializer接口

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

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

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

可以通过下面任一中方式添加到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:

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

扩展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中的内容,文本中尽管放一些天马行空的内容好了。

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

Spring Boot(七)扩展分析的更多相关文章

  1. 精尽Spring Boot源码分析 - Condition 接口的扩展

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  2. Spring Boot 启动原理分析

    https://yq.aliyun.com/articles/6056 转 在spring boot里,很吸引人的一个特性是可以直接把应用打包成为一个jar/war,然后这个jar/war是可以直接启 ...

  3. 精尽Spring Boot源码分析 - 序言

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  4. 精尽Spring Boot源码分析 - Jar 包的启动实现

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  5. 精尽Spring Boot源码分析 - 文章导读

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  6. 精尽Spring Boot源码分析 - SpringApplication 启动类的启动过程

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  7. 精尽Spring Boot源码分析 - 内嵌Tomcat容器的实现

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  8. 精尽Spring Boot源码分析 - 支持外部 Tomcat 容器的实现

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  9. 精尽Spring Boot源码分析 - 剖析 @SpringBootApplication 注解

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  10. 使用Spring Session实现Spring Boot水平扩展

    小编说:本文使用Spring Session实现了Spring Boot水平扩展,每个Spring Boot应用与其他水平扩展的Spring Boot一样,都能处理用户请求.如果宕机,Nginx会将请 ...

随机推荐

  1. linux popen 获取 ip test ok

    任务:unix,linux通过c程序获取本机IP. 1. 标准I/O库函数相对于系统调用的函数多了个缓冲区(,buf),安全性上通过buf 防溢出. 2.printf 这类输出函数中“ ”若包含“记得 ...

  2. 第一章:程序设计和C语言

    一.什么是计算机程序? 所谓程序就是一组计算机能识别和执行的指令.计算机的一切操作都是由程序控制的,本质是程序的机器,程序和指令是计算机系统最基本的概念. 二.什么是计算机语言? 人和计算机交流信息要 ...

  3. vue生命周期和react生命周期对比

    一 vue的生命周期如下图所示(很清晰)初始化.编译.更新.销毁 二 vue生命周期的栗子 注意触发vue的created事件以后,this便指向vue实例,这点很重要 <!DOCTYPE ht ...

  4. BZOJ1012_Maxnumber_KEY

    题目传送门 这是一道单调栈的问题,单调栈维护所有数的最大值. 查询操作时只需要二分找答案即可,枚举栈内的数应该也不会超时. code: /******************************* ...

  5. redis外部访问

    1.redis的搭建这里就不做描述的了,可以参考我的另外一个博客. http://www.cnblogs.com/ll409546297/p/6993778.html 2.说明一下我们在其他服务器上面 ...

  6. FreeRTOS信号量的封装函数参数是二级指针

    1. 先看正确的封装方式,问题所在,为什么要用2级指针 void cissys_lockcreate(void** mutex) { //创建信号量,应该是互斥锁 *mutex = ((Semapho ...

  7. LWM2M简介-学习记录

    1. Lightweight M2M 基础,谁搞出来的 OMA是一家国际组织,因为物联网的兴起, OMA在传统的OMA-DM协议基础之上,提出了LWM2M协议.这个协议基于COAP协议,COAP协议基 ...

  8. MySQL高级-showProfile

    一.Show Profile是什么? 是MySql提供可以用来分析当前会话中语句执行的资源消耗情况,可以用于SQL的调优的测量. 默认情况下,参数处于关闭状态,并保存最近15次的运行结果. 二.分析步 ...

  9. 如何实现最佳的跨平台游戏体验?Unity成亮解密实时渲染

    7月31日,2018云创大会游戏论坛在杭州国际博览中心103B圆满举行.本场游戏论坛聚焦探讨了可能对游戏行业发展有重大推动的新技术.新实践,如AR.区块链.安全.大数据等. Unity大中华区技术经理 ...

  10. WebDriver--定位元素的8种方式

    在UI层面的自动化测试开发中,元素的定位与操作是基础,也是经常遇到的困难所在.webdriver提供了8种定位: 1. id定位:find_element_by_id("id值") ...