美文网首页SpringBoot
第一章 SpringBoot基础

第一章 SpringBoot基础

作者: liaijuyyer | 来源:发表于2021-11-05 00:22 被阅读0次

一 自定义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激活

    Jrebel激活后 默认是联网使用的 在该模式下 jrebel会一直联网监测激活信息 所以要改为离线方式使用

    安装完JRebel之后 会多出如下两个按钮 以这两个按钮去启动你的应用 即可以热部署 然后当你修改完文件后使用Command + shift + F9 手动触发编译 编译完成后 重新请求即可以得到最新的内容(不需要重启应用)

  • 基于idea的HotSwap插件实现热部署 这里不做过多赘述 与jrebel差不太多

相关文章

网友评论

    本文标题:第一章 SpringBoot基础

    本文链接:https://www.haomeiwen.com/subject/wvulzltx.html