一 自定义banner
所谓SpringBoot Banner 其实就是SpringBoot应用启动时 在控制台上打印的SpringBoot的图标 如下图所示
这个banner是可以支持自定义的, 官网自定义banner教程 简单来说就是在项目的classpath下加一个名为banner.txt的文件 或者也可以通过设置spring.banner.location属性来修改banner.txt文件的位置 banner.txt里放banner的文案即可
banner.txt
在线SpringBoot banner生成
二 SPI
SPI 全称为(Service Provider Interface) 是JDK内置的一种服务提供发现机制,SPI是一种动态替换发现的机制。比如有个接口 想运行时动态的给它添加实现。你只需要自己实现这个接口即可。比如java.sql.Driver接口 其他不同厂商可以针对同一接口做出不同的实现 而java SPI机制则可以为某个接口寻找服务的实现
Java SPI就是提供这样的一个机制:为某个接口寻找服务实现的机制。有点类似IOC的思想,就是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要。所以SPI的核心思想就是解耦
SPI使用场景
概括地说,适用于:调用者根据实际使用需要,启用、扩展、或者替换框架的实现策略 比较常见的例子:
- 数据库驱动加载接口实现类的加载
JDBC加载不同类型数据库的驱动 - 日志门面接口实现类加载
SLF4J加载不同提供商的日志实现类 - Spring
Spring中大量使用了SPI,比如:对servlet3.0规范对ServletContainerInitializer的实现、自动类型转换Type Conversion SPI(Converter SPI、Formatter SPI)等 - Dubbo
Dubbo中也大量使用SPI的方式实现框架的扩展, 不过它对Java提供的原生SPI做了封装,允许用户扩展实现Filter接口
JAVA SPI使用介绍
要使用Java SPI,需要遵循如下约定:
- 1、当服务提供者提供了接口的一种具体实现后,在jar包的META-INF/services目录下创建一个以“接口全限定名”为命名的文件,内容为实现类的全限定名
- 2、接口实现类所在的jar包放在主程序的classpath中
- 主程序通过java.util.ServiceLoder动态装载实现模块,它通过扫描META-INF/services目录下的配置文件找到实现类的全限定名,把类加载到JVM
- SPI的实现类必须携带一个不带参数的构造方法
JAVA SPI 示例
- 第一步 定义一个接口 并为该接口提供多个实现
public interface IShout {
void shout();
}
public class Cat implements IShout {
@Override
public void shout() {
System.out.println("miao miao");
}
}
public class Dog implements IShout {
@Override
public void shout() {
System.out.println("wang wang");
}
}
-
第二步
在 src/main/resources/ 下建立 /META-INF/services 目录, 新增一个以接口命名的文件 (org.foo.demo.IShout文件),内容是要应用的实现类(这里是org.foo.demo.animal.Dog和org.foo.demo.animal.Cat,每行一个类)
文件位置如下:
- src
-main
-resources
- META-INF
- services
- org.foo.demo.IShout
文件内容
org.foo.demo.animal.Dog
org.foo.demo.animal.Cat
- 第三步 使用 ServiceLoader 来加载配置文件中指定的实现
public class SPIMain {
public static void main(String[] args) {
ServiceLoader<IShout> shouts = ServiceLoader.load(IShout.class);
for (IShout s : shouts) {
s.shout();
}
}
}
//执行结果会输出两个实现
wang wang
miao miao
三 SpringBoot 外部配置文件优先级
SpringBoot外部配置文件的优先级 官网链接
下面的配置实测建议将springboot项目打成jar包后 测试 直接在idea中测试 ./xx的配置并没有生效
实测
四 SpringBoot 配置优先级
刚刚第三节是SpringBoot外部配置文件的优先级 但是除了外部配置文件外还有很多种方式可以对SpringBoot进行配置 具体配置的优先级如下 注意test的配置只有在跑单元测试的是 才能够覆盖应用本来的配置 官网配置说明
五 SpringBoot Profile配置
SpringBoot Profile 与 Spring Profile是一个东西 就是Spring的多环境配置 详见下图 这里不再多说 激活profile配置可以在application.properties文件中增加如下配置
#激活多个环境用,隔开
spring.profiles.active=dev,hsqldb
六 SpringBoot 热部署
SpringBoot项目 实现热部署有两种方式
-
基于spring-boo-devtools
如果一个springboot项目要启用热部署的功能 只需要在pom文件中引入spring-boo-devtools依赖即可<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency>
需要注意的是 当运行完全打包的应用时 开发者工具将会自动禁用 如果你的应用是使用java -jar的方式或者特殊的类加载器来启动,那么springboot会认为这是一个生产环境的应用。建议将devtools设置为依赖可选(pom中optional关键字为true即表示该依赖是可选的 这样这个依赖不会被传递 比如一个应用引入另外一个依赖 这个依赖引入了devtools 但是optional设置为true 则当前应用不会有devtools的依赖 也就是不会被传递) idea中不推荐使用dev tools 来做热部署 需要额外改配置 热部署才能生效
-
基于idea的热部署插件JRebel
JRebel插件安装之后 需要激活(不是免费的)JRebel激活
- 生成一个GUID https://www.guidgen.com
- 根据反向代理服务器地址拼接激活地址 https://jrebel.qekang.com/{GUID}
- 打开JRebel激活面板 选择Connect to online licensing service
- 点work offline
Jrebel激活后 默认是联网使用的 在该模式下 jrebel会一直联网监测激活信息 所以要改为离线方式使用
安装完JRebel之后 会多出如下两个按钮 以这两个按钮去启动你的应用 即可以热部署 然后当你修改完文件后使用Command + shift + F9 手动触发编译 编译完成后 重新请求即可以得到最新的内容(不需要重启应用)
- 基于idea的HotSwap插件实现热部署 这里不做过多赘述 与jrebel差不太多
网友评论