Spring Boot 基本配置

news2024/11/19 3:46:53

大家好!我是今越。简单记录一下在 Spring Boot 中的一些基本配置。

Banner 配置

配置文件 application.properties

# 设置路径和名称,默认路径名称 resources/banner.txt
spring.banner.location=classpath:banner1.txt
# 启动项目时,关闭 banner 打印输出,或者在 IntelliJ IDEA 启动配置项中选择 Hide banner
spring.main.banner-mode=off

自定义 banner.txt 文件中的内容

${AnsiColor.RED}
       .__                              __
  _____|  |__   ____   ____   ______   |__|__ __
 /  ___/  |  \_/ __ \ /    \ /  ___/   |  |  |  \
 \___ \|   Y  \  ___/|   |  \\___ \    |  |  |  /
/____  >___|  /\___  >___|  /____  >\__|  |____/
     \/     \/     \/     \/     \/\______|

MANIFEST.MF 中的版本号:

${application.version}
${application.formatted-version}

Spring Boot 的版本号:

${spring-boot.version}
${spring-boot.formatted-version}

Banner 内容生成网站地址

http://patorjk.com/software/taag
http://www.network-science.de/ascii/
https://www.degraeve.com/img2txt.php

在启动类中,通过代码关闭 banner 打印输出

package indi.shensju.banner2;

import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Banner2Application {

//    public static void main(String[] args) {
//        SpringApplication.run(Banner2Application.class, args);
//    }
  
    public static void main(String[] args) {
        // 关闭 Banner
        SpringApplication app = new SpringApplication(Banner2Application.class);
        app.setBannerMode(Banner.Mode.OFF);
        app.run(args);
    }
}

Web 容器

常见的 Web 容器有 Tomcat, Jetty, Undertow,在 Spring Boot 框架中默认使用 Tomcat 作为 Web 容器。
配置文件 application.properties

# 不启动web容器
#spring.main.web-application-type=none

# 端口
# 特殊值-1 表示关闭所有的http端口
# 特殊值0  表示随机的http端口
#server.port=0

# 开启请求响应压缩
server.compression.enabled=true

当 server.port=0 时,通过程序获取容器端口

/**
 * 自定义类,实现应用程序监听器接口,来获取web容器启动端口
 */
@Component
public class MyApplicationListener implements ApplicationListener<WebServerInitializedEvent> {
    @Override
    public void onApplicationEvent(WebServerInitializedEvent webServerInitializedEvent) {
        System.out.println("webServerInitializedEvent.getWebServer().getPort() = " + webServerInitializedEvent.getWebServer().getPort());
    }
}

请求响应压缩解释

/**
 * 测试接口,返回集合
 */
@RestController
public class HelloController {
    @GetMapping("hello")
    public List<String> hello() {
        List<String> list = new ArrayList<>();
        for (int i = 0; i < 1000; i++) {
            list.add("shensju" + i);
        }
        return list;
    }
}

当未开启请求响应压缩时,F12 打开开发者工具,查看请求响应头信息

HTTP/1.1 200
Content-Type: application/json
Transfer-Encoding: chunked
Date: Sun, 05 Mar 2023 04:36:20 GMT
Keep-Alive: timeout=60
Connection: keep-alive

当开启请求响应压缩时,请求响应头信息

HTTP/1.1 200
vary: accept-encoding
Content-Encoding: gzip
Content-Type: application/json
Transfer-Encoding: chunked
Date: Sun, 05 Mar 2023 04:35:48 GMT
Keep-Alive: timeout=60
Connection: keep-alive

相比之下,增加了两项内容

vary: accept-encoding
Content-Encoding: gzip

Tomcat 配置

日志配置

Tomcat 日志分为两种类型:
1)访问日志 accesslog 用于记录外部请求,默认不开启
2)服务器内部日志

访问日志

配置文件 application.properties

# 生成的访问日志将在该目录下
server.tomcat.basedir=my-tomcat
# 开启访问日志,默认的日志位置在项目运行的临时目录中,默认生成的日志文件名称格式 access_log.2023-03-03.log
server.tomcat.accesslog.enabled=true
# 生成日志文件名称的前缀,默认是access_log
server.tomcat.accesslog.prefix=shensju2
# 生成日志文件名称的后缀
server.tomcat.accesslog.suffix=.log
# 生成的日志文件名称中的日期格式
server.tomcat.accesslog.file-date-format=.yyyyMMdd

# 生成的日志文件内容格式也是可以调整的
# %h 请求的客户端IP
# %l 用户的身份
# %u 用户名
# %t 请求时间
# %r 请求地址
# %s 响应的状态码
# %b 响应的大小
server.tomcat.accesslog.pattern=%h %l %u %t \"%r\" %s %b

access_log.2023-03-03.log

0:0:0:0:0:0:0:1 - - [03/Mar/2023:20:54:03 +0800] "GET /hello HTTP/1.1" 200 10
127.0.0.1 - - [03/Mar/2023:20:54:40 +0800] "GET /hello HTTP/1.1" 200 10
127.0.0.1 - - [03/Mar/2023:20:54:41 +0800] "GET /favicon.ico HTTP/1.1" 404 124
127.0.0.1 - - [03/Mar/2023:20:54:49 +0800] "GET /hello HTTP/1.1" 200 10
127.0.0.1 - - [03/Mar/2023:20:55:00 +0800] "GET /hello HTTP/1.1" 200 10

服务器内部日志

配置文件 application.properties

# 服务器内部日志开启
logging.level.org.apache.tomcat=debug
logging.level.org.apache.catalina=debug

HTTPS 证书配置

通常,https 证书是在 nginx 上进行配置的。Spring Boot 内嵌的 tomcat https 证书配置步骤如下:

第一步:生成 https 证书

keytool -genkey -alias myhttps -keyalg RSA -keysize 2048 -keystore shensju_key.p12 -validity 365
回车输入密码,例如123456

第二步:将生成的证书文件,拷贝至项目的 resources 目录下

第三步:在 application.properties 配置文件中进行配置

sever.ssl.key-alias=myhttps
server.ssl.key-store=classpath:shensju_key.p12
server.ssl.key-store-password=123456

第四步:创建接口,启动项目

/**
 * 测试接口
 */
@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "hello https";
    }
}

在浏览器中访问地址:http://127.0.0.1:8080/hello
https证书配置1

修改成 https 进行访问
https证书配置2

补充:使用 http 访问时,自动跳转到 https 进行访问

程式化写法如下

package indi.shensju.https.config;

import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author shensju
 * @date 2023/3/3 21:42
 * https端口 8080
 * http端口 8081
 * 访问 http://127.0.0.1:8081/hello 转换为 https://127.0.0.1:8080/hello
 */
@Configuration
public class TomcatConfig {
    @Bean
    TomcatServletWebServerFactory tomcatServletWebServerFactory() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        factory.addAdditionalTomcatConnectors(myConnectors());
        return factory;
    }

    private Connector myConnectors() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(8081);
        connector.setSecure(false);
        connector.setRedirectPort(8080);
        return connector;
    }
}

配置文件

名称和路径

application.properties
application.yaml
application.yml

配置文件有四个默认位置:
配置文件位置

  • config/application.properties
  • application.properties
  • src/main/resources/config/application.properties
  • src/main/resources/application.properties

优先级依次降低,1 > 2 > 3 > 4

自定义配置文件路径/名称

  • IDEA工具设置环境变量
  • 打包后,通过命令行启动配置
# 切换到项目jar所在文件目录后,执行以下命令
java -jar properties-0.0.1-SNAPSHOT.jar --spring.config.location=classpath:/shensju/

命令行参数说明

# 指定配置文件的路径
--spring.config.location=classpath:/shensju/
# 指定配置文件的名称
--spring.config.name=shensju

引用 maven 配置

举例,application.properties

# 配置文件中引用maven配置,使用@@,不是${}
#app.encoding=@project.build.sourceEncoding@
#app.java.version=@java.version@

# 在pom.xml文件中自定义定界符,这里使用%
app.encoding=%project.build.sourceEncoding%
app.java.version=%java.version%

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>indi.shensju</groupId>
    <artifactId>properties</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>properties</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <!--自定义定界符-->
        <resource.delimiter>%</resource.delimiter>
    </properties>
    // ...
</project>

短命令行参数

举例,application.properties

# 配置短命令行参数,设置默认端口
server.port=${port:8088}

打包后,通过命令行启动配置

# 切换到项目jar所在文件目录后,执行以下命令
# 从 --server.port 改变为 --port
java -jar properties-0.0.1-SNAPSHOT.jar --port=9099

属性注入

Spring 属性注入

book.properties 配置文件,单独创建配置文件,和在 application.properties 中配置系统属性区分开

book.name=人生
book.author=路遥
book.tags=小说,历史,生活

Spring 的配置

package indi.shensju.properties;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * @author shensju
 * @date 2023/3/4 11:01
 */
@Component
@PropertySource("classpath:book.properties")
public class Book {
    @Value("${book.name}")
    private String name;
    @Value("${book.author}")
    private String author;
    @Value("${book.tags}")
    private String[] tags;
    // setter, getter, toString
}

类型安全的属性注入

Spring 配置的基础上,配合使用 Spring Boot 提供的注解

package indi.shensju.properties;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * @author shensju
 * @date 2023/3/4 11:01
 */
@Component
@PropertySource("classpath:book.properties")
@ConfigurationProperties(prefix = "book")
public class Book {
    private String name;
    private String author;
    private String[] tags;
    // setter, getter, toString
}

YAML 配置

和 properties 配置基本上差不多,在 resources 目录下创建 application.yaml 配置文件

# web容器配置
server:
  port: 8088
  tomcat:
    accesslog:
      enabled: true
# 属性注入
book:
  namea: 水浒传
  tags:
    - 历史
    - 小说
    - 明代
  authors:
    - name: 罗贯中
      age: 88
    - name: 施耐庵
      age: 99

实体类创建如下

package indi.shensju.yaml;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * @author shensju
 * @date 2023/3/4 12:14
 * javase 反射 内省
 * 和属性名称无关,通过属性的getter,setter方法名称来处理属性值注入
 */
@Component
@ConfigurationProperties(prefix = "book")
public class Book {
    private String aaa;
    // 注意:数组、集合属性在yaml配置文件中的赋值写法
    private List<String> tags;
    private List<Author> authors;

    @Override
    public String toString() {
        return "Book{" +
                "name='" + aaa + '\'' +
                ", tags=" + tags +
                ", authors=" + authors +
                '}';
    }

    public String getNamea() {
        return aaa;
    }

    public void setNamea(String name) {
        this.aaa  = name;
    }

    public List<String> getTags() {
        return tags;
    }

    public void setTags(List<String> tags) {
        this.tags = tags;
    }

    public List<Author> getAuthors() {
        return authors;
    }

    public void setAuthors(List<Author> authors) {
        this.authors = authors;
    }
}

/**
 * Author类
 */
public class Author {
    private String name;
    private Integer age;
    // setter, getter, toString
}

Profile 多环境配置

多配置文件,用于不同的环境,如开发、测试、生产。名称需要自定义,然后在默认配置文件中决定使用哪个配置。

application.properties 公共配置

# 指定使用application-prod文件中的配置
spring.profiles.active=prod

application-dev.properties 开发环境配置
application-test.properties 测试环境配置
application-prod.properties 生产环境配置

唯有热爱可抵岁月漫长。我是今越,欢迎大家点赞、收藏和评论,感谢支持!

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

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

相关文章

语法篇JQuery基础

目录 一、初识JQuery 1.1JQuery介绍 导入方式 常用公式 1.2快速入门 二、JQuery入门 2.1文档就绪函数 2.2名称冲突 2.3JQuery选择器 表单选择器 2.4JQuery过滤器 基础过滤器(Basic Fiter) 子元素过滤器 内容过滤器 可见性过滤器 三、JQuery事件与特效 3.1JQuery…

set/map学习

我们要开始学习map和set的使用&#xff0c;虽然使用更加复杂&#xff0c;但是STL整体的设计&#xff0c;本身就具有很强的前瞻性和延续性&#xff0c;比如说迭代器等&#xff0c;我们顺着文档来看。这也是除了vector之外最重要的容器&#xff0c;当然还有unordered_map 和 unor…

g++ 编译选项

1&#xff0c;基本编译过程 g可以用于编译C代码生成可执行程序&#xff0c;从原始代码到生成可执行过程中实际经历了以下4个步骤&#xff1a; 1. 预处理&#xff1a;宏替换&#xff0c;注释消除&#xff0c;查找相关库文件等[使用-E参数]。 # 只激活预处理&#xff0c;不会自…

集成正态云和动态扰动的哈里斯鹰优化算法(IHHO)-附代码

集成正态云和动态扰动的哈里斯鹰优化算法(IHHO) 文章目录 集成正态云和动态扰动的哈里斯鹰优化算法(IHHO)1.哈里斯鹰优化算法2.改进哈里斯鹰优化算法2.1 正态云模型2.2 随机反向学习思想2.3 动态扰动策略 3.实验结果4.参考文献5.Matlab代码6.python代码 摘要&#xff1a; 针对基…

Uni-app学习从0到1开发一个app——(3)简单小工程内容介绍

文章目录 工程文件 看看一个标准的hello微信小程序工程文件的组成和作用。 工程文件 可以参考官方教程&#xff1a;传送门 之前的文章有详细的开发环境介绍&#xff0c;传送门Uni-app学习从0到1开发一个app——(2)windowns环境搭配&#xff0c;这里我们先建一个简单的示例微信…

【工具】Xshell-7和Xftp-7下载安装使用教程

目录 一、Xshell和Xftp 二、安装包下载(Xshell和Xftp) 三、Xshell安装、使用和常用设置 1. Xshell安装&#xff1a; 2. Xshell使用: 3. Xshell常用设置 三、Xftp安装、使用 1. Xftp安装 2. Xftp使用 一、Xshell和Xftp Xshell&#xff1a; Xshell是一款强大的SSH&#xff…

【数据结构与算法分析】树上漫步之探究前序、中序、后序、广度优先遍历算法的实现与优化

文章目录 前言二叉树的遍历方式构建二叉树递归遍历二叉树非递归遍历二叉树层次遍历 示例二叉树结果总结 前言 二叉树是数据结构中最基本的数据结构之一&#xff0c;它在计算机科学中有着非常重要的应用。二叉树的遍历是指按照一定的顺序遍历二叉树中的所有节点&#xff0c;是二…

DML——数据库查询语言

查询——select SELECT [DISTINCT/ALL/] {*|column|expression [alias],…} FROM table [Natuarl join /] where子句; Natuarl join 自然连接只考虑那些在两个关系模式中都出现的属性上取值相同的元祖队。 列名&#xff08;属性名&#xff09;完成相同值相同去除重复列拓展&…

【Typora+Lsky】在deepin使用YGXB-net/lsky-upload上传图片

本文首发于 慕雪的寒舍 在win和deepin上使用lsky-upload上传图片 1.说明 先前使用lsky图床的时候&#xff0c;我一直用的是picgo的插件来上传图片。 但最近picgo总是遇到卡上传的问题 https://github.com/Molunerfinn/PicGo/issues/1060 后来在gitee上面搜到了这个项目&…

Django实现接口自动化平台(七)数据库设计

上一章&#xff1a; Django实现接口自动化平台&#xff08;六&#xff09;httprunner&#xff08;2.x&#xff09;基本使用【持续更新中】_做测试的喵酱的博客-CSDN博客 下一章&#xff1a; 一、数据库设计 接口自动化平台&#xff0c;内置引擎&#xff0c;使用的是httprun…

【LeetCode热题100】打卡19天:最大数组和跳跃游戏

文章目录 【LeetCode热题100】打卡第19天&#xff1a;最大数组和&跳跃游戏⛅前言 最大数组和&#x1f512;题目&#x1f511;题解 跳跃游戏&#x1f512;题目&#x1f511;题解 【LeetCode热题100】打卡第19天&#xff1a;最大数组和&跳跃游戏 ⛅前言 大家好&#xff…

A股市场全景分析系列—从每日涨停个股分析热门板块与题材

前言‍‍ 当前市场股票多但资金有限&#xff0c;因此已经无法出现全面上涨的行情。这样一来识别当前的“风口”显得尤为重要&#xff0c;也就是上车热门板块、热门题材、强势个股&#xff01; 因此聚焦分析涨停板个股显得尤为重要&#xff01; 我们统计了近&#xff15;个交易日…

【算法题解】38. 括号的生成

这是一道 中等难度 的题 https://leetcode.cn/problems/generate-parentheses/ 题目 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;["…

DNS隧道穿透

介绍&#xff1a; DNS隧道&#xff0c;是隧道技术中的一种。当我们的HTTP、HTTPS这样的上层协议、正反向端口转发都失败的时候&#xff0c;可以尝试使用DNS隧道。DNS隧道很难防范&#xff0c;因为平时的业务也好&#xff0c;使用也罢&#xff0c;难免会用到DNS协议进行解析&am…

线上问题记录20230610-NGINX代理大文件下载问题

线上问题记录20230610-NGINX代理大文件下载问题 问题描述 我们有一个在线项目&#xff1a;是一个对象文件存储服务&#xff0c;是用来给用户提供文件对象存储的。今天用户在使用的时候发现超过1G的文件无法进行下载。幸好今天是星期六&#xff0c;使用的人并不是特别多&#…

华为OD机试真题 JavaScript 实现【最长的连续子序列】【2022Q4 100分】

一、题目描述 有N个正整数组成的一个序列&#xff0c;给定一个整数sum&#xff0c;求长度最长的的连续子序列使他们的和等于sum&#xff0c;返回该子序列的长度&#xff0c;如果没有满足要求的序列返回-1。 二、输入描述 第1行有N个正整数组成的一个序列。 第2行给定一个整…

【LIN通讯出现问题】

LIN信号发出了&#xff0c;但是没有收到响应的原因 如果你发送了LIN&#xff08;局域网互连&#xff09;信号&#xff0c;但没有收到响应&#xff0c;可能有以下几个原因&#xff1a; 线路故障&#xff1a;检查信号线路是否连接正确&#xff0c;可能存在接触不良、开路或短路等…

【PCB专题】Allegro 单线、差分线自动绕等长功能介绍

在文章【PCB专题】案例:绕等长怎么直接以颜色区分看出是否绕好 中我们讲到Allegro 16.6版本的Timing Vision功能可以直接在PCB上以颜色的区分就能看出单线和差分是否已经绕成等长了,不再需要到规则管理器中去查看。 那么其实Allegro还有单线自动绕等长的功能——Auto interac…

mac电脑储存内存越来越小如何清理释放空间?

如果你是一位Mac系统的用户&#xff0c;可能会发现你的电脑储存空间越来越小。虽然Mac系统设计得非常优秀&#xff0c;但是系统数据和垃圾文件也会占据大量的储存空间。在这篇文章中&#xff0c;我们将探讨mac系统数据怎么这么大&#xff0c;以及mac清理系统数据怎么清理。 一…

# Telegraph-Image:利用Cloudflare Pages和Telegraph无成本创建自己的图床

Telegraph-Image&#xff1a;利用Cloudflare Pages和Telegraph无成本创建自己的图床 Telegraph-Image是一个具有以下特点的图像托管服务&#xff1a; 特点&#xff1a; 无限图片储存数量&#xff1a;你可以上传不限数量的图片&#xff0c;没有存储限制。免费托管&#xff1a…