Spring Boot(七)扩展分析
前面的章节在分析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(七)扩展分析的更多相关文章
- 精尽Spring Boot源码分析 - Condition 接口的扩展
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- Spring Boot 启动原理分析
https://yq.aliyun.com/articles/6056 转 在spring boot里,很吸引人的一个特性是可以直接把应用打包成为一个jar/war,然后这个jar/war是可以直接启 ...
- 精尽Spring Boot源码分析 - 序言
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- 精尽Spring Boot源码分析 - Jar 包的启动实现
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- 精尽Spring Boot源码分析 - 文章导读
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- 精尽Spring Boot源码分析 - SpringApplication 启动类的启动过程
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- 精尽Spring Boot源码分析 - 内嵌Tomcat容器的实现
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- 精尽Spring Boot源码分析 - 支持外部 Tomcat 容器的实现
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- 精尽Spring Boot源码分析 - 剖析 @SpringBootApplication 注解
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- 使用Spring Session实现Spring Boot水平扩展
小编说:本文使用Spring Session实现了Spring Boot水平扩展,每个Spring Boot应用与其他水平扩展的Spring Boot一样,都能处理用户请求.如果宕机,Nginx会将请 ...
随机推荐
- 使用PHPExcel 对表格进行,读取和写入的操作。。。。
下面的代码是使用PHPExcel 对多个表格数据进行读取, 然后整合的写入新的表格的方法!!!代码有点粗糙 , 多多保函!!! 这里有些地方注意下,如果你的表格数据过大, 一定要记得修改php.ini ...
- 优步北京B组奖励政策
用户组:优步北京B组(2015年7月20日前激活的部分司机) 更新日期:2015年8月4日 滴滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最 ...
- PHP中strtotime()的使用
strtotime是一个非常强大的函数. 传入的参数,详见官网的介绍 本月最后一个周日 echo date('Y-m-d',strtotime('last sunday of this month') ...
- cc2541测试SimpleBLEPeripheral例程
1. 修改工程选项,去掉CC2540_MINIDK,烧写CC2541代码 2. 打开手机软件TruthBlue2_7 3. 准备看下特征值4的通信,在周期处理里面,一直读取特征值3的值,然后由特征值4 ...
- linux进程的学习笔记(未完)
1. 进程是程序执行的一个实例,如果16个用户同时运行vi,那么有16个独立的进程,尽管它们共享同一个可执行代码,问题在于FreeRTOS这种系统,是否可以建2个相同的任务,需要注意什么?在linux ...
- Java 快速排序讲解
快速排序由于排序效率在同为 O(nlogn) 的几种排序方法中效率最高,因此经常被采用.再加上快速排序思想——分治法也确实非常实用,所以 在各大厂的面试习题中,快排总是最耀眼的那个.要是你会的排序算法 ...
- centos配置ip地址 添加多个ip地址的方法
操作如下,登陆SSH: vi /etc/sysconfig/network-scripts/ifcfg-eth0: 第二个IP,就是 vi /etc/sysconfig/network-scripts ...
- Andorid自定义attr的各种坑
本文来自网易云社区 作者:孙有军 在开发Andorid应用程序中,经常会自定义View来实现各种各样炫酷的效果,在实现这吊炸天效果的同时,我们往往会定义很多attr属性,这样就可以在XML中配置我们想 ...
- python 水仙花
#简单def narcissus(): for n in range(100, 1000, 1): a, b, c = n//100, (n//10)%10, (n%100)%10 if a ** 3 ...
- thinkphp5保存远程图片到本地
代码 protected function saveImg($imgUrl){ $ext=strrchr($imgUrl,'.'); if(!in_array($ext,['.jpg','.png', ...