美文网首页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