目录标题
- 一、文档地址
- 二、第一个spring boot例子
- 三、 Starters(spring boot 官方提供的启动器)
- 四、@SpringBootApplication注释
- (一)@EnableAutoConfiguration
- (二)ComponentScan
- 五、devtools(热插拔)
- 六、开启debug模式
- 七、故障分析器(启动spring boot失败)
- 八、 自定义横幅(启动logo)
- 九、配置文件YAML 、properties...
- (一)配置优先级
- 1. jar包内部(项目内设置)
- 2. jar包外部(打包后)
- 2. 启动jar时的命令行参数(启动项目时)
- 4. 配置分支dev、test、prod
- (二)@Value 导入
- (三)随机配置值
- (四)@ConfigurationProperties
- (五)@ConfigurationProperties + @PropertySource 指定文件加载配置
- (六)@ConfigurationProperties + @EnableConfigurationProperties
- (七)@Validated(导入的配置校验)
- (八)@ConfigurationProperties vs. @Value
一、文档地址
spring boot 官方文档
二、第一个spring boot例子
import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.web.bind.annotation.*;
@RestController
@EnableAutoConfiguration
public class Example {
@RequestMapping("/")
String home() {
return "Hello World!";
}
public static void main(String[] args) throws Exception {
SpringApplication.run(Example.class, args);
}
}
三、 Starters(spring boot 官方提供的启动器)
Starters 是,spring boot 使用起来十分方便的原因之一。官方提供了各种应用场景下的启动器,只要我们在maven中导入了相应的依赖坐标(jar包),spring boot 就能帮我们自动配置好相关的插件,即开箱即用。
spring boot 官方的启动器命名一般为:spring-boot-starter-XXX
;我们在自定义启动器时,因该避免和官方的命名风格一致。可以命名为:spring-boot-XXX-starter
;
注意: spring-boot-starter-actuator
这个启动器在spring cloud中会常常使用它当作微服务的运行的监视和管理。
四、@SpringBootApplication注释
@SpringBootApplication注释
它是一个复合注解 ,由三个核心注解组成:@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan
你可以将@SpringBootApplication 换成 上面三个注解,程序依旧能运行起来。
//这个注解其实就是Configuration,这里只是换了个名字
@SpringBootConfiguration
//spring boot 能够自动装配的核心注解
@EnableAutoConfiguration
//配置包扫描,将扫描到在类上标注了@Component,@Controller,@Service 等注解的类,实例化为单例bean,交给spring 容器管理。
@ComponentScan(
excludeFilters = {@ComponentScan.Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @ComponentScan.Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public class SpringBoot01HelloworldQuickApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBoot01HelloworldQuickApplication.class, args);
}
}
(一)@EnableAutoConfiguration
@EnableAutoConfiguration 注解可以通过配置过滤器(exclude、excludeName属性)来排除一些,不需要spring boot 自动装配的类。
可以看到注解有两个属性,他们都是数组类型。exclude 是根据类进行排除,excludeName根据类名。
注意: 数组类型需要使用{}括号括起来,使用逗号进行分隔多个排除项。
import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
import org.springframework.context.annotation.*;
@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}
(二)ComponentScan
包扫描可以选择哪些路径下的bean自动实例化注册到容器中。
五、devtools(热插拔)
spring boot 热部署
六、开启debug模式
配置文件:application.properties
# 默认关闭 ,true开启
debug=true
七、故障分析器(启动spring boot失败)
八、 自定义横幅(启动logo)
配置文件:application.properties
# 默认开启 ,off关闭
spring.main.banner-mode=off
九、配置文件YAML 、properties…
Spring Boot 允许在外部加载您的配置,以便您可以使用相同的配置, 不同环境中的应用程序代码(dev、test、prod
)。您可以使用properties 文件、YAML 文件、 环境变量(dev、test、prod)和命令行参数,灵活的改变配置。配合一些注解(@Value 、@ConfigurationProperties、@PropertySource + @ConfigurationProperties
)将配置值直接注入到您的 bean 中, 通过 Spring 的抽象访问,或绑定到结构化 对象通过 。
官方文档提供了以下改变配置的方式:
(一)配置优先级
优先级从高到低,高优先级的配置覆盖低优先级的配置
,所有的配置会形成互补配置 。
- 命令行参数。所有的配置都可以在命令行上进行指定;
- 来自java:comp/env的JNDI属性;
- Java系统属性(System.getProperties());
- 操作系统环境变量 ;
- jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
- jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件 再来加载不带profile
- jar包外部的application.properties或application.yml(不带spring.profile)配置文件
- jar包内部的application.properties或application.yml(不带spring.profile)配置文件
- @Configuration注解类上的@PropertySource
常见的配置方式有三种:jar包内部(项目内设置)、jar包外部(打包后)、启动jar时的命令行参数(启动项目时)。
内容参考与SpringBoot 配置文件加载优先级
1. jar包内部(项目内设置)
jar包内部(项目内设置)也有优先级之分。 这里的优先级也是要遵循上面1-9级的,只是配置优先级同在6、8级时,再根据下面的优先级进行加载
。
如果配置文件没有被idea识别出来,可以参考这里修改idea的配置。
2. jar包外部(打包后)
通过maven将test代码带包成jar(创建一个spring boot 项目,然后新建几个配置文件,改一下每个配置文件的端口号)
# 通过下面的命令启动
java -jar xxx.jar
发现运行的端口号是8083,而不是在打包前的8081。原因是,spring boot 打包时是不会把 ./config ./这两级的目录打包进去
。
通过jar包外配置文件覆盖 jar包内的配置文件。
SpringBoot 支持把配置文件放在外部。只要把配置文件放在jar包的同级目录下,或者放在同级下的config文件夹中,SpringBoot都会去此处读取配置文件
在打包的jar包目录下创建两个配置文件,一个放到jar包同级目录下,一个放到config中。
config/application.yml : port: 8085
application.yml : port: 8086
重新启动jar
java -jar xxx.jar
结果为8085。
2. 启动jar时的命令行参数(启动项目时)
使用方式,在启动jar包的命令后面增加启动参数。java -jar xxx.jar --配置名=属性值
java -jar xxx.jar --server.port=8087
4. 配置分支dev、test、prod
如果配置文件中出现了分支。那么jar包内部(项目内设置)、jar包外部(打包后)的优先级在指定的分支之后。也就是如果配置了分支那么以配置的分支为准。(这个可以自行测试)
指定了活跃的分支,那么会优先分支的配置
spring:
profiles:
active: prod
---
server:
port: 8081
spring:
profiles: prod
---
server:
port: 8082
spring:
profiles: test
---
server:
port: 8083
spring:
profiles: dev
命令行 > jar包外指定的分支 > jar包内指定的分支 > jar包外(config目录下)> jar包外(同级目录) > jar包内(config目录下)> jar包内
(二)@Value 导入
通过@Value 导入配置文件中的一些属性值到bean内。
import org.springframework.stereotype.*;
import org.springframework.beans.factory.annotation.*;
@Component
public class MyBean {
@Value("${my.name}")
private String name;
@Value("${my.age}")
private int age;
}
application.yml 、application.properties:
my:
name: lihua
age: 18
注意:@Value 注解只能导入名字为:application的配置文件的配置。
(三)随机配置值
application.yml 、application.properties:
my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random.uuid}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int[1024,65536]}
注意: 配置文件中${} 为占位符,可以导入其他配置 。
app.name=MyApp
app.description=${app.name} is a Spring Boot application
(四)@ConfigurationProperties
@Value(“${my.name}”) 只能标注在属性上,一个个属性进行注入配置,比较麻烦,可以通过@ConfigurationProperties 可以按照名字匹配(支持宽松绑定
)进行批量注入
。
@Component
@ConfigurationProperties(prefix = "my")
@Data
@ToString
public class User1 {
private int id;
private String name;
private int age;
}
注意: 只使用这个注解只能导入名字为:application的配置文件的配置。
(五)@ConfigurationProperties + @PropertySource 指定文件加载配置
@Component
@PropertySource("123.properties")
@ConfigurationProperties(prefix = "my1")
@Data
@ToString
public class User2 {
private int id;
private String name;
private int age;
}
(六)@ConfigurationProperties + @EnableConfigurationProperties
通过@EnableConfigurationProperties 注解,将配置导入到UserProperties中。
/**
* @author lihua
* @date 2022/12/27 8:59
**/
@EnableConfigurationProperties({UserProperties.class})
@Configuration
public class UserAutoConfiguration {
}
/**
* @author lihua
* @date 2022/12/27 8:58
**/
@ConfigurationProperties(prefix = "my2")
@Data
@ToString
public class UserProperties {
private int id;
private String name;
private int age;
}
注意:这里不需要增加@Component 注解(加了就直接是第(四)点 的方式加载配置了)
(七)@Validated(导入的配置校验)
@Null 限制只能为null
@NotNull 限制必须不为null
@NotEmpty 只作用于字符串类型,字符串不为空,并且长度不为0
@NotBlank 只作用于字符串类型,字符串不为空,并且trim()后不为空串
@AssertFalse 限制必须为false
@AssertTrue 限制必须为true
@DecimalMax(value) 限制必须为一个不大于指定值的数字
@DecimalMin(value) 限制必须为一个不小于指定值的数字
@Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位
数不能超过fraction
@Future 限制必须是一个将来的日期
@Past 验证注解的元素值(日期类型)比当前时间早
@Max(value) 限制必须为一个不大于指定值的数字
@Min(value) 限制必须为一个不小于指定值的数字
@Pattern(value) 限制必须符合指定的正则表达式
@Size(max,min) 限制字符长度必须在min到max之间
@Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式
注意:
@NotNull 适用于任何类型被注解的元素必须不能与NULL
@NotEmpty 适用于String Map或者数组不能为Null且长度必须大于0
@NotBlank 只能用于String上面 不能为null,调用trim()后,长度必须大于0