大家好!我是今越。简单记录一下在 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 进行访问
补充:使用 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
生产环境配置
唯有热爱可抵岁月漫长。我是今越,欢迎大家点赞、收藏和评论,感谢支持!