一、 自动配置:
1、 Spring 环境
1)应用程序属性配置文件
Spring Boot 自动配置的 bean 都可以通过从 Spring 环境中提取的属性进行配置。
在 src/main/resources/application.properties
application.properties
:
server.port=8081
或者在src/main/resources/application.yml
application.yml
:
server:
port: 8081
2)命令行参数
命令行终端中执行:
java -jardemo-1.0-SNAPSHOT.jar --server.port=8081
3)JVM 系统属性
4)操作系统环境变量
export SERVER_PORT=8081
注意:
在将属性设置为环境变量时,命名风格略有不同,以适应操作系统对环境变量名称的限制。
Spring 能够将其分类并将 SERVER_PORT 转译为 server.port。
2、配置数据源
如mysql数据库,在application.yml
:
spring:
datasource:
url: jdbc:mysql://localhost:3306/demotest?characterEncoding=utf-8&serverTimezone=GMT%2B8
username: demotest
password: 123456
# driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
properties:
hibernate:
show_sql: true
format_sql: true
# redis配置
redis:
localhost: localhost
port: 6379
database: 2
password:
# rocketmq配置
rocketmq:
consumer:
consumer-group: DemoConsumerGroup
producer:
producer-group: DemoProducerGroup
namesrv-addr: 127.0.0.1:9876
需要将适当的 JDBC 驱动程序添加到构建中,但通常不需要指定 JDBC 驱动程序类;
springboot 可以从数据库 URL 的结构中找到它。
但如果有问题,可以试着设置 spring.datasource.schema 和 spring.datasource.data 属性
spring:
datasource:
url: jdbc:mysql://localhost:3306/demotest?characterEncoding=utf-8&serverTimezone=GMT%2B8
username: demotest
password: 123456
schema:
- user-schema.sql
data:
- user.sql
在 JNDI 中配置数据源,Spring 从那里查找它,通过配置 spring.datasource.jndi-name 来设置数据源。
如果设置了 spring.datasource.jndi-name 属性,那么其他数据源的连接属性(如果设置了)会被忽略
spring:
datasource:
url: jdbc:mysql://localhost/demotest?charsetEncoding=utf8&useUnicode=true
username: demotest
password: 123456
jndi-name: java:/comp/env/jdbc/demoDS
3、配置嵌入式服务器

server:
port: 8000
显式地设置 server.port 为8000,但是服务器不会在端口8000上启动。它将从随机选择的可用端口启动。
但是底层服务器不仅仅是一个端口。需要对底层容器做的最常见的事情之一是将其设置为处理 HTTPS 请求。
首先,通过使用 JDK 的 keytool 命令行工具创建一个密钥存储。
$ keytool -keystore mykeys.jks -genkey -alias tomcat -keyalg RSA
在命令行指定属性或者在 application.properties 或 application.yml 文件中设置它们。
application.yml:
server:
port: 8443 #开发 HTTPS 服务器的常用选择
ssl:
# server.ssl.key-store,设置为创建密钥存储库文件的路径,file:// URL 表示从文件系统加载它。
# 如果将它打包到应用程序 JAR 文件中,将使用一个 classpath: URL来引用它.
key-store: file:///path/to/mykeys.jks
# server.ssl.key-store-password 属性,设置为创建密钥存储时指定的密码值
key-store-password: pwddemo
# server.ssl.key-password 属性, 设置为创建密钥存储时指定的密码值
key-password: pwddemo
4、配置日志
Spring Boot 默认通过 Logback
配置日志,默认为 INFO 级别,然后写入控制台。
可以在类路径的根目录(在 src/main/resources 中)创建 logback .xml 文件进行配置。
logback .xml
:
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<logger name="root" level="INFO"/>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
使用 Spring Boot 配置属性,可以在不创建 logback .xml 文件的情况下进行这些更改。
默认情况下,日志文件在大小达到 10 MB
时就会进行循环写入。
logging:
path: /var/logs/ # /var/logs/ 文件夹有写权限
file: Demo.log # 日志将被写到 /var/logs/Demo.log 文件中
level:
root: WARN
org:
springframework:
security: DEBUG
5、使用特殊的属性值
${}
占位符标记:
greeting:
welcome: ${
spring.application.name}
占位符嵌入到其他文本中:
greeting:
welcome: You are using ${
spring.application.name}
使用配置属性配置 Spring 自己的组件可以很容易地将值注入这些组件的属性并调整自动配置。
二、创建自定义的配置属性
1、定义配置属性持有者
Spring Boot 提供了@ConfigurationProperties 注释,支持配置属性的属性注入。
@ConfigurationProperties
:
demotest:
orders:
pageSize: 10
OrderProps
:
package com.example.springbootlearn.web;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import lombok.Data;
@Component
@ConfigurationProperties(prefix="demotest.orders")
@Data
@Validated
public class OrderProps {
@Min(value=5, message="must be between 5 and 25")
@Max(value=25, message="must be between 5 and 25")
private int pageSize = 20;
}
OrderController
:
@Controller
@RequestMapping("/orders")
@SessionAttributes("order")
public class OrderController {
private OrderRepository orderRepo;
private OrderProps props;
public OrderController(OrderRepository orderRepo,
OrderProps props) {
this.orderRepo = orderRepo;
this.props = props;
}
...
@GetMapping
public String ordersForUser(
@AuthenticationPrincipal User user, Model model) {
Pageable pageable = PageRequest.of(0, props.getPageSize());
model.addAttribute("orders",
orderRepo.findByUserOrderByPlacedAtDesc(user, pageable));
return "orderList";
}
}
2、声明配置属性元数据
在项目下的 src/main/resources/META-INF 下,中创建一个名为 additional-spring-configuration-metadata.json
的文件。
{
"properties": [
{
"name": "demotest.orders.page-size",
"type": "java.lang.String",
"description":"Sets the maximum number of orders to display in a list."
}
]
}
比如demotest.orders.page-size 相当于demotest.orders.pageSize。
在pom.xml引入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
三、使用profile 文件配置
1、定义profile的属性
profile 文件是一种条件配置类型。在不同的环境,根据运行时激活的 profile 文件应用或忽略不同的 bean、配置类和配置属性。
文件的名称应该遵循这个约定:application-{profile 名称}.yml
或 application-{profile 名称}.properties
。
如创建一个名为 application-prod.yml 的新文件。
application-prod.yml
:
spring:
datasource:
url: jdbc:mysql://localhost/demotest
username: root
password: 123456
logging:
level:
demotest: WARN
另一种指定特定 profile 文件的属性的方法只适用于 YAML 配置。
将特定 profile 的属性与非 profile 的属性一起放在 application.yml
中,由三个连字符分隔。
application.yml
:
# 第一部分没有为 spring.profiles 指定值,它的属性对于所有 profile 文件都是通用的。
# 或者如果指定的 profile 文件没有设置其他属性,它就是默认的。
logging:
level:
demotest: DEBUG
--- # ---连字符 ,表示第二部分
spring:
profiles: prod # 第二部分为 spring.profiles 指定一个值,如 prod,表示随后应用于 prod 配置文件的属性。
datasource:
url: jdbc:mysql://localhost/demotest
username: root
password: 123456
logging:
level:
demotest: WARN
2、激活 profile 文件
1)设置 application.yml
中的这个属性即可激活:
spring:
profiles:
active:
- prod
2)使用环境变量设置激活的 profile
export SPRING_PROFILES_ACTIVE=prod
设置完成后,部署于那台机器的任何应用程序将会使用 prod profile。同时相应的配置属性将优先于默认配置文件中的属性。
3)命令行设置激活的 profile
如果使用可执行的 JAR 文件来运行应用程序,也可以通过命令行设置激活的 profile 文件。
命令行终端中执行:
java -jar demotest.jar --spring.profiles.active=prod
可以指定多个活动 profiles 文件,这是一个逗号分隔的列表,当它设置一个环境变量:
export SPRING_PROFILES_ACTIVE=prod,audit,ha
而在yaml中,需要如下指定:
spring:
profiles:
active:
- prod
- audit
- ha
3、使用 profile 文件(有添加)创建 bean
只有在某个配置文件处于活动状态
时才需要创建一些 bean。通过@Profile
注解可以将 bean 指定为只适用于给定的 profile 文件。如下:
@Bean
@Profile("dev")
public CommandLineRunner dataLoader(UserRepository userRepo, PasswordEncoder encoder) {
// ...
}
如果需要在 dev profile 或是 qa profile 被激活时创建 CommandLineRunner,如下:
@Bean
@Profile({
"dev", "qa"})
public CommandLineRunner dataLoader(UserRepository userRepo, PasswordEncoder encoder) {
// ...
}
如果这个 CommandLineRunner bean 总是被创建,除非 prod 配置文件是活动的,如下:
感叹号 !
否定了配置文件名称
@Bean
@Profile("!prod")
public CommandLineRunner dataLoader(UserRepository userRepo, PasswordEncoder encoder) {
// ...
}
可以在整个 @Configuration 注解的类(单独的配置类)上使用 @Profile
。如下:仅在 prod 和 qa 配置文件都不活动的情况下才会被创建。
@Profile({
"!prod", "!qa"})
@Configuration
public class DevelopmentConfig {
@Bean
public CommandLineRunner dataLoader(UserRepository userRepo, PasswordEncoder encoder) {
// ...
}
}