SpringBoot3基础特性

news2025/1/12 15:51:04

SpringBoot3基础特性

SpringApplication

自定义banner

banner.png

  • 类路径添加banner.txt或设置spring.banner.location就可以定制banner
  • 推荐网站:Spring Boot banner在线生成工具,制作下载英文banner.txt,修改替换banner.txt文字实现自定义。

提示:
可以通过修改配置文件application.properties配置文件来关闭banner。

spring.main.banner-mode=off

自定义SpringApplication

@SpringBootApplication
public class Boot311Application {

    public static void main(String[] args) {
        //SpringApplication:Boot应用的核心API入口
       //SpringApplication.run(Boot311Application.class, args);
        
        //1、自定义SpringApplication的底层设置
        SpringApplication springApplication = new SpringApplication(Boot311Application.class);
        
        //调整SpringApplication的参数
        //和配置文件设置冲突时,会优先配置文件
        springApplication.setBannerMode(Banner.Mode.CONSOLE);
        
        //2、SpringApplication运行
        springApplication.run(args);
    }
}

FluentBuilder API

//Builder方式构造SpringApplication
new SpringApplicationBuilder()
        .main(Boot311Application.class)
        .bannerMode(Banner.Mode.CONSOLE)
        .sources(Boot311Application.class)
        .run(args);

Profiles

环境隔离能力,快速切换开发、测试、生产环境

实现步骤

  • 标识环境:指定哪些组件、配置在什么时候生效
  • 切换环境:这个环境对应的所有组件和配置就应该生效
①、指定环境

Spring Profiles提供一种隔离配置的方式,使其仅在特定环境生效,任何@Component,@Configuration或@ConfigurationProperties可以使用@Profile标记,来指定何时被加载(容器中的组件都可以被@Profile标记)。

②、环境激活

使用修改配置文件application.properties方式激活。

spring.profiles.active=dev,test
测试

创建四个组件Cat、Dog、Pig和Sheep。

Cat

@Data
@Component
@Profile({"dev", "test"})
public class Cat {
    private String name;
    private String color;
}

Dog

@Component
@Data
@Profile("test")
public class Dog {
    private String name;
    private String age;
}

Pig

@Component
@Data
@Profile({"prod"})
public class Pig {
    private Integer id;
    private String name;
}

Sheep

@Component
@Data
public class Sheep {
    private Long id;
    private String name;
    private Integer age;
}

测试及结果

@Slf4j
@SpringBootApplication
public class Boot311Application {

    public static void main(String[] args) {
        //Builder方式构造SpringApplication
        ConfigurableApplicationContext context = new SpringApplicationBuilder()
                .main(Boot311Application.class)
                .bannerMode(Banner.Mode.CONSOLE)
                .sources(Boot311Application.class)
                .run(args);

        try {
            //由于在没有找到的情况下会抛异常
            Cat cat = context.getBean(Cat.class);
            log.info("组件cat:{}", cat);
        }catch (Exception e){

        }

        try {
            Dog dog = context.getBean(Dog.class);
            log.info("组件dog:{}", dog);
        }catch (Exception e){

        }

        try {
            Pig pig = context.getBean(Pig.class);
            log.info("组件pig:{}", pig);
        }catch (Exception e){

        }

        try {
            Sheep sheep = context.getBean(Sheep.class);
            log.info("组件sheep:{}", sheep);
        }catch (Exception e){

        }
    }
}

/**
 * 1、标识环境
 *      1) dev(开发环境)、test(测试环境)、prod(生产环境)、default(在没有设置激活时会生效,但设置激活不是default时不会生效)
 *          组件没有标注@Profile代表任意时候都生效
 *      2) 指定每个组件在哪个环境下生效
 *          @Profile({"dev", "test"})
 *      3) 默认只有激活指定环境,这些组件才会生效
 *  结果;组件sheep:Sheep(id=null, name=null, age=null)
 * 2、激活环境
 *      1)使用配置文件:spring.profiles.active=dev,test
 *          结果:
 *              组件cat:Cat(name=null, color=null)
 *              组件dog:Dog{name='null', age='null'}
 *              组件sheep:Sheep(id=null, name=null, age=null)
 *      2)命令行激活:java -jar xxx.jar --spring.profile.active=dev
 */ 
③、环境包含

Spring.profiles.active和spring.profiles.default属性用于配置和激活不同环境下的配置文件。通常情况下,这些属性应该在专门用于配置环境的文件中进行设置,而不是在application-dev.yaml这样的具体环境文件中。也可以额外添加生效文件(表示不管激活哪个环境,这个包含的环境都要有。即总是要生效的环境。),而不是激活文件。比如:

spring.profiles.include[0]=common
spring.profiles.include[1]=local
总结:

生效的环境 = 激活的环境 + 默认环境(没有添加@Profile) + 包含的环境.
项目中使用:
基础的配置:mybatis、log…:写到(include)包含环境中
需要动态切换变换的环境:db、redis:写到激活环境,可以使用spring.profiles.group.xxx=dev, test进行分组,只需要激活xxx就可以将分组中的内容全部激活。

Profile配置文件

  • application-{profile}.properties可以作为指定环境的配置文件。
  • 激活这个环境,配置就会生效。最终生效的所有配置是:

application.properties:主配置文件,任意时候都生效
application-{profile}.properties:指定环境配置文件,激活指定环境生效。
Profile配置文件.png
例如:

在application.properties文件中添加配置。

spring.profiles.active=dev

表示在激活dev环境的时候配置文件application-dev.properties生效。

注意:
①、当激活的配置文件内容和主配置文件冲突时,以激活的为主。
②、项目的所有生效配置项 = 激活环境配置文件的所有项 + 主配置文件不冲突的所有项

多环境并发控制

除了SpringBoot外很多的构建工具都有多环境的情况,如:Maven、SpringBoot,如果两者都配置并且它们的环境不同,应该以先加载的环境为主。

a、当maven与SpringBoot同时对多环境进行控制时,以Mven为主,SpringBoot使用@maven中activ标签名称@占位符读取Maven对应的配置属性
b、基于SpringBoot读取Maven配置属性的前提下,如果在Idea下测试工程时,pom.xml每次更新需要手动compile方可生效。
示例:

在pom.xml中,我们可以使用Maven的profiles来定义这些不同的环境配置。

<profiles>
  <profile>
    <id>dev</id>
    <properties>
      <db.url>jdbc:mysql://localhost:3306/dev_db</db.url>
      <db.username>dev_user</db.username>
      <db.password>dev_password</db.password>
    </properties>
  </profile>
  <profile>
    <id>prod</id>
    <properties>
      <db.url>jdbc:mysql://localhost:3306/prod_db</db.url>
      <db.username>prod_user</db.username>
      <db.password>prod_password</db.password>
    </properties>
  </profile>
</profiles>

在Spring Boot的配置文件application.properties中,使用@maven注解来读取Maven配置文件中定义的属性。

spring.datasource.url=@maven.db.url@
spring.datasource.username=@maven.db.username@
spring.datasource.password=@maven.db.password@

外部化配置

场景:线上应用如何快速修改配置,并应用最新配置?

  • SpringBoot使用配置优先级 + 外部配置简化配置、简化运维
  • 只需要给jar应用所的文件夹放一个application.properties最新配置文件,重启项目就能自动应用最新配置。

配置优先级

SpringBoot允许将配置外部化,以便可以在不同的环境中使用相同的应用程序代码。我们可以使用各种外部配置源,包括Java Properties文件,YAML文件、环境变量和命令行参数。@Value可以获取值,也可以用@ConfiguraionProperties将所有属性绑定到java object中。

以下是SpringBoot属性源加载顺序(优先级由低到高,高优先级配置会覆盖低优先级。),后面的会覆盖前面的值。

  • 默认属性( spring.application.setDefaultProperties指定)
  • @PropertySource指定加载的配置(需要写在@Configuration类上才生效)
  • 配置文件(application.properties/yaml等)
  • RandomValuePropertySource支持的random.*配置(如:@Value(“${random.int}”))
  • OS环境变量
  • Java系统属性(来自System.Properties())
  • JNDI属性(来自java:comp/env)
  • ServletContext初始化参数
  • ServletConfig初始化参数
  • SPRING_APPLICATION_JSON属性(内置在环境变量或系统属性中的JSON)
  • 命令行参数
  • 测试属性。(@SpringBootTest进行测试时指定的属性)
  • 测试类@TestPropertySource注解
  • Devtoos设置的全局属性。($HOME/.config/spring-boot)

结论:
配置可以写道很多位置,常见的优先级顺序:命令行>配置文件>springapplication配置

配置文件优先级如下(从低到高):

  • jar包内的application.properties/yaml
  • jar包内的application-{profile}.properties/yaml
  • jar包外的application.propeterties/yaml
  • jar包外的application-{profile}.properties/yaml

结论:包外>包内
建议:
①、使用一种格式的配置文件,如果.properties和.yaml同时存在,则.properties优先。
②、所有参数均可由命令行传入,使用–参数项=参数值,例如:–property=value,将会被添加到环境变量中,并优先于配置文件,比如java -jar app.jar --name = “spring”,可以使用@Value(“${name}”)获取。

外部配置

SpringBoot应用启动时会自动寻找application.properties和application.yaml位置进行加载。优先级从低到高如下:

类路径(内部)

  • 类根路径
  • 类下/config包

当前路径(项目所在的位置,外部)

  • 当前路径
  • 当前/config子目录
  • /config目录的直接子目录

优先级.png

总结

  • 命令行>所有
  • 包外>包内
  • config目录>根目录
  • profile>application

配置不同就都生效(部署),配置相同高优先级覆盖低优先级。

导入配置

在配置文件中使用如下配置:

spring.config.import=classpath:/xxx.properties

它和使用@PropertySource效果相同。

注意:配置文件的优先级高于导入配置的优先级。

属性占位符

配置文件中可以使用${name:default}形式取出之前配置过的值

app.name=MyApp
app.description = ${app.name}是我的名字

示例:

application.properties

hello.test= this is my test

控制器

@RestController
public class HelloController {
    @Value("${hello.test:1433223}")
    String test;

    @GetMapping("/hello")
    public String test(){
        return test;
    }
}

取值.png

单元测试-JUnit5

整合

SpringBoot提供一系列测试工具及注解方便我们进行测试。

spring-boot-test提供核心测试能力,spring-boot-test-autoconfigure提供测试的一些自动配置。只需要导入spring-boot-starter-test即可整合测试。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

spring-boot-starter-test默认提供的测试库有:JUnit5、Spring Test、AssertJ、Hamcrest、Mockito、JSONassert、JsonPath

测试
组件测试

直接使用@Autowired容器中的组件进行测试

示例

创建HelloService

@Service
public class HelloService {
    public int sum(int a, int b){
        return a+b;
    }
}

在测试类中测试

//测试类也必须在主程序所在的包及其子包
@SpringBootTest//具备测试SpringBoot应用容器中所有组件的功能
class Boot311ApplicationTests {
    //测试方法
    @Autowired//自动注入任意组件即可测试
    HelloService helloService;

    @Test
    void contextLoads() {
        int sum = helloService.sum(2, 5);
        System.out.println("sum = " + sum);
    }
    /*sum = 7*/
}
注解

JUnit5的注解与JUnit4注解有所变化
官方文档
junit5.png

参数化测试:

使得用不同的参数多次运行测试成为了可能,为单元测试带来了便利。
利用@ValueSource等注解,指定入参, 可以使用不同的参数进行多次单元测试,而不需要每新增一个参数就新增一个单元测试,减少了代码冗余。

@ValueSource #为参数化测试制定了入参来源,支持八大基本类型以及String类型和Class类型。
@NullSource #表示为参数化测试提供一个null得入参
@EnumSource #表示为参数化测试提供一个枚举入参
@CsvFileSource #表示读取指定CSV文件内容作为参数化测试入参
@MethodSource #表示读取指定方法的返回值作为参数化限额是入参(方法返回需要是一个流)
示例
@ParameterizedTest
@ValueSource(strings = {"one", "two", "three"})
@DisplayName("参数化测试")
public void parameterizedTest1(String string){
    System.out.println(string);
    //使用断言方式
    Assertions.assertTrue(StringUtils.isNotBlank(string));
}
/*
* one
  two
  three
* */

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1203388.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChineseChess.2023.11.13.01

中国象棋残局模拟器ChineseChess.2023.11.13.01

react路由安装配置react-router-dom/‘Switch‘ is not defined报错解决

1.安装 npm install --save react-router-dom安装完成 新建两个页面并导出 app.js import Nav from ./components/Nav import Home from ./components/Home import { Link, Route, Switch } from react-router-domfunction App() {return (<div><div><p>&…

二十四、W5100S/W5500+RP2040树莓派Pico<PHY的状态模式控制>

文章目录 1. 前言2. 相关简介2.1 简述2.2 原理2.3 优点&应用 3. WIZnet以太网芯片4. PHY模式配置测试4.1 程序流程图4.2 测试准备4.3 连接方式4.4 相关代码4.5 测试现象 5. 注意事项6. 相关链接 1. 前言 W5100S/W5500不仅支持自动PHY自动协商&#xff0c;而且支持用户自定义…

低代码平台如何提高开发效率?

目录 一、开发工具&#xff1a;JNPF 二、产品分析 1可视化应用开发 2流程管理 3特别支持整个平台源码合作 三、使用技巧 四、总结 在当今快速发展的软件开发领域&#xff0c;提高生产效率和质量是每个开发团队追求的目标。JNPF&#xff08;Java Non-Enterprise Applicat…

C/C++:在#define中使用参数

文章目录 在#define中使用参数参考资料 在#define中使用参数 在#define中使用参数可以创建外形和作用与函数类似的类函数宏。带有 参数的宏看上去很像函数&#xff0c;因为这样的宏也使用圆括号。类函数宏定义的圆 括号中可以有一个或多个参数&#xff0c;随后这些参数出现在替…

MASK、MPSK、MFSK信号的调制与解调+星座图

MASK、MPSK、MFSK信号的调制与解调星座图 本文主要涉及多进制幅度键控&#xff08;MASK&#xff09;、多进制相移键控&#xff08;MPSK&#xff09;、多进频移键控&#xff08;MFSK&#xff09;的调制与解调&#xff0c;同时涉及到星座图的分析。 关于通信原理还有其他文章可参…

2023/11/13JAVA学习

字节数组增大的同时,运行速度也会加快,但是大到一定程度就不行了 要想追加数据,要在低级流后面加true,高级流后面加不了 不是乱码,不是让人看的 保持数据一一对应 否则会报错 下载后,拷贝到一个包里,再 comment是你想添加的注释 txt文本也可

宝塔开心版hostcli的广告去除

首先感谢hostcli把宝塔7.6剥离了&#xff0c;直接安装我这里是缺少pyenv的包。 直接进入正题吧。 定位到页面左下方的广告位于 /www/server/panel/BTPanel/templates/default/layout.html “退出”按钮下方有条线开始去掉 去掉之前的忘了截图了&#xff0c;就这样吧&#xff…

幼师一旦开窍,工作真的没有这么难

真心希望所有新手幼教老师都能知道啊 只有输入关键词和要求&#xff0c;几秒就能生成一篇教案&#xff0c;从教学目标到教学内容都能给你安排的妥妥的。而且可以多次生成&#xff0c;每次生成都是不一样的内容。 什么教案、发言稿、总结、评语都能用的上啊&#xff0c;幼师姐…

【Kettle实战】数据分批处理及参数化传递子作业任务

对于大表操作&#xff0c;本来离线数据需要分批处理&#xff0c;刚开始只会用具体日期去做&#xff0c;通过复制多分转换和作业来处理。当日期范围大了后&#xff0c;这是个苦力活儿&#xff0c;kettle里面有参数化传递功能&#xff0c;多动手实操&#xff0c;懂得灵活变通自然…

【PG】PostgreSQL 目录结构

目录 1 软件安装目录 2 数据文件目录 base/&#xff1a;存储每个数据库的基本数据文件 global/&#xff1a;包含了全局性质的系统表空间文件 pg_tblspc/&#xff1a;包含了表空间的符号链接 pg_twophase/&#xff1a;包含了两阶段提交中使用的文件 pg_stat_tmp/&#xff…

Mysql Explain工具介绍

使用EXPLAIN关键字可以模拟优化器执行SQL语句&#xff0c;分析查询语句或是结构的性能瓶颈。 准备表 -- 课程表 CREATE TABLE class (id int(11) NOT NULL,name varchar(45) DEFAULT NULL,update_time datetime DEFAULT NULL,PRIMARY KEY (id)) ENGINEInnoDB DEFAULT CHARSET…

msvcr71.dll丢失多种解决方法解析,全方位解读msvcr71.dll文件

在日常使用电脑时&#xff0c;你是否曾遇到过“msvcr71.dll文件丢失”的错误提示&#xff1f;别着急&#xff0c;本文将为你详细介绍msvcr71.dll丢失的解决方法&#xff0c;让你迅速解决这一烦恼。 一.多种msvcr71.dll丢失解决方法 修复方法一:重新安装相应软件 首先&#xf…

QML14、Qt之Q_PROPERTY宏理解

在初学Qt的过程中,时不时地要通过F2快捷键来查看QT类的定义,发现类定义中有许多Q_PROPERTY的东西,比如最常用的QWidget的类定义: Qt中的Q_PROPERTY宏在Qt中是很常用的,那么它有什么作用呢? Qt提供了一个绝妙的属性系统,Q_PROPERTY()是一个宏,用来在一个类中声明一个属…

家电制造产线物料追踪RFID智能管理解决方案

家电行业需求 家电行业的生产节奏快&#xff0c;供应商众多&#xff0c;导致入厂车辆经常出现拥堵和等待的情况&#xff0c;生产线可能因为关键零部件物流未到位而停产&#xff0c;传统的家电制造行业生产物流模式主要依赖人工进行零部件的存储、拣选、配送、核对和发放等环节…

[WiFi] WiFi TPC原理及认证要求

TPC说明 发射功率控制 &#xff08;TPC&#xff09; 是 WLAN 设备使用的一种机制&#xff0c;用于确保缓解因子至少 来自大量设备的总功率为 3 dB。这要求 RLAN 器件的 TPC 范围为对于具有 TPC 的器件&#xff0c;其最低值至少比表 2 中给出的平均 值低 6 dB。 TPC机制及认证要…

C#中.NET Framework 4.8控制台应用通过EF访问已建数据库

目录 一、创建.NET Framework 4.8控制台应用 二、建立数据库 1. 在SSMS中建立数据库Blogging 2.在VS上新建数据库连接 三、安装EF程序包 四、自动生成EF模型和上下文 1.Blog.cs类的模型 2.Post.cs类的模型 3.BloggingContext.cs数据库上下文 五、编写应用程序吧 我们…

四点定球-克拉默法则

一、原理 使用克拉默法则进行四点定球 - 知乎 二、代码实现 c /// <summary> /// 四个不共面的点 用克拉默法则 计算球心和半径 /// </summary> /// <param name"p1"></param> /// <param name"p2"></param> /// &l…

跨国企业如何选择安全靠谱的跨国传输文件软件?

随着全球化的不断发展&#xff0c;跨国企业之间的合作变得越来越频繁。而在这种合作中&#xff0c;如何安全、可靠地将文件传输给合作伙伴或客户&#xff0c;成为了跨国企业必须面对的问题。 然而&#xff0c;跨国文件传输并不是一件容易的事情&#xff0c;由于网络物理条件的…

springboot整合SSE技术开发经验总结及心得

springboot整合SSE技术开发经验总结及心得 一、开发背景二、快速了解SSE1、概念2、特性 三、开发思路四、代码演示1、引入依赖2、服务端代码3、后端定时任务代码 4、解决乱码的实体类4、前端代码 五、核心代码分析 一、开发背景 公司需要开发一个大屏界面&#xff0c;大屏页面…