1、IDEA:使用 Spring Initializer快速创建项目
IDE都支持使用Spring的项目创建向导快速创建一个Spring Boot项目;
选择我们需要的模块;向导会联网创建Spring Boot项目;
新建父工程:
后续操作同上
子模块的pom文件中的parent要修改为我们之前新建的父工程
继承关系-springboot maven项目
1.使用spring initializer 新建一个父 maven 选择POM
2.使用spring initializer 新建一个子 maven 选择maven project
修改子项目中继承方式
springboot_initializer -->springboot_parent-->spring-boot-starter-parent
默认生成的Spring Boot项目;
如果SpringApplication默认设置不符合您的喜好,则可以创建一个本地实例并对其进行自定义。例如,要关闭横幅,您可以编写:
public static void main(String[] args) {
SpringApplication app = new SpringApplication(MySpringConfiguration.class);
app.setBannerMode(Banner.Mode.OFF);
app.run(args);
}
通过构造者模式流式构造SpringApplication:
new SpringApplicationBuilder()
.bannerMode(Banner.Mode.OFF)
.run(args);
官网关于SpringApplication的使用
SpringBoot使用一个全局的配置文件 核心配置文件,配置文件名在约定的情况下 名字是固定的;
配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;
•application.properties
•application.yml
•application.yaml
YAML(YAML Ain't Markup Language)
YAML A Markup Language:是一个标记语言
YAML isn't Markup Language:不是一个标记语言;
两种配置文件的格式
在springboot框架中,resource文件夹里可以存放配置的文件有两种:properties和yml。
1、application.properties的用法:扁平的k/v格式。
server.port=8081
server.servlet.context-path=/springboot
2、application.yml的用法:树型结构。
server:
port: 8088
servlet:
context-path: /springboot
两种前者是properties,而后者是yml的,建议使用后者,因为它的可读性更强。 可以看到要转换成YML我们只需把properies里按.去拆分即可。
k:(空格)v:表示一对键值对(空格必须有);
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的
属性和值也是大小写敏感;
如果有特殊字符% & 记得用单引号(‘)包起来
**/application*.yml
**/application*.yaml
**/application*.properties
如果同时存在不同后缀的文件按照这个顺序加载主配置文件;互补配置;
后续实测后发现各版本不一样优先级都不一样,比较混乱:
2.3.x
官方没有具体说明,实测以properties为准
2.4.0
所以这个版本我们看到的yml优先
2.4.4
2.5.4
总结: 官网最后给出了说明建议整个应用程序使用一种格式,并且既然每个版本的优先级都有区别,我们就不要纠结这个后缀文件的优先级了。
springboot 启动还会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件
低↓
1.classpath根目录下的
2.classpath根config/
3.项目根目录
如果当前项目是继承/耦合 关系maven项目的话,项目根目录=父maven项目的根目录
4.项目根目录/config
5.直接子目录/config
java -jar configuration_file-0.0.1-SNAPSHOT.jar --spring.config.location=D:\config/
高↓
优先级由底到高,高优先级的配置会覆盖低优先级的配置;互补配置;
官网:
optional:classpath:/
optional:classpath:/config/
optional:file:./
optional:file:./config/*/
optional:file:./config/
optional:classpath:custom-config/ --spring.config.location
optional:file:./custom-config/ --spring.config.location
Profile的意思是配置,对于应用程序来说,不同的环境需要不同的配置。
SpringBoot框架提供了多profile的管理功能,我们可以使用profile功能来区分不同环境的配置。
1、多Profile文件
1.Spring官方给出的语法规则是application-{profile}.properties(.yaml/.yml)。
2.如果需要创建自定义的的properties文件时,可以用application-xxx.properties的命名方式, 根据实际情况,我创建了一个开发环境下使用的properties文件和一个生产环境下使用的properties文件,其中只对端口进行了配置,如下图所示:
a.开发环境如下:
b.生产环境如下:
3.若我们需要在两种环境下进行切换,只需要在application.properties中加入如下内容即可。
先按照位置来读取优先级, 在同一位置下profile优先级最高, 如果没有指定profile, 先yml--yaml--properties
bean也可以使用@Profile("dev")来区分环境
2、激活指定profile
java -jar configuration_file-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;
使用spring.config.location 指定的配置文件, 是不会进行互补。
java -jar configuration_file-0.0.1-SNAPSHOT.jar --spring.config.location=D:/application.properties
java -jar configuration_file-0.0.1-SNAPSHOT.jar --spring.config.name=application-prod
所有配置文件按以下顺序考虑: 优先级从低到高
java -jar configuration_file-0.0.1-SNAPSHOT.jar
jar包之外的配置文件 yml-->yaml-->properties
optional:classpath:/config/ yml-->yaml-->properties
optional:classpath:/ yml-->yaml-->properties
java -jar configuration_file-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
jar包之外的配置文件 ./config/ profile-dev --> yml-->yaml-->properties
jar包之外的配置文件 ./config/*/ profile-dev --> yml-->yaml-->properties
jar包之外的配置文件 ./ profile-dev --> yml-->yaml-->properties
optional:classpath:/config/ profile-dev --> yml-->yaml-->properties
optional:classpath:/ profile-dev --> yml-->yaml-->properties
java -jar configuration_file-0.0.1-SNAPSHOT.jar --spring.config.location=D:/application.properties
优先级最大, 因为指定了具体的配置文件。 所以不会和默认的约定配置文件进行互补
1、@PropertySource你的@Configuration类的注释。请注意,Environment在刷新应用程序上下文之前,不会将此类属性源添加到。现在配置某些属性(例如在刷新开始之前读取的logging.*和)为时已晚spring.main.*。
@PropertySource("classpath:appSource.properties")
会和约定的配置文件形成互补
一定要指定.properties配置
2、默认属性(由 setting 指定SpringApplication.setDefaultProperties)。
会和约定的配置文件形成互补
public static void main(String[] args) throws IOException {
SpringApplication springApplication = new SpringApplication(ExternConfigurationApplication.class);
// 创建Properties
Properties properties = new Properties();
// 通过当前类的ClassLoader
InputStream is= ExternConfigurationApplication.class.getClassLoader()
.getResourceAsStream("app.properties");
// 将输入流读取成properties
properties.load(is);
springApplication.setDefaultProperties(properties);
springApplication.run(args);
}
3、配置数据(如application.properties文件)
约定配置文件
4、操作系统环境变量。
set spring.config.location=D:\config/
java -jar 03_extern_configuration-0.0.1-SNAPSHOT.jar
5、Java 系统属性 ( System.getProperties())。
会使约定配置文件失效
idea
命令行java属性
java -Dspring.config.location=D:\config\application-java.properti
es -jar 03_extern_configuration-0.0.1-SNAPSHOT.jar
6、JNDI 属性来自java:comp/env.
7、ServletContext 初始化参数。
ServletContext 的配置标签需要写到 web-app (根标签)中 ,具体如下:
spring.config.location
xxx.properties
8、ServletConfig 初始化参数。
ServletConfig 的配置标签需要写到 Servlet 标签中,标签如下:
spring.config.location
xxx.properties
9、来自SPRING_APPLICATION_JSON(嵌入在环境变量或系统属性中的内联 JSON)的属性。
10、命令行参数。
会使约定配置文件失效
java -jar configuration_file-0.0.1-SNAPSHOT.jar --spring.config.location=D:/application.properties
11、properties属性在您的测试中。可用于测试应用程序的特定部分@SpringBootTest的测试注释。
12、@TestPropertySource 测试中的注释。
用在单元测试上的
@TestPropertySource("classpath:appSource.properties")
13、$HOME/.config/spring-boot当 devtools 处于活动状态时,目录中的Devtools 全局设置属性。
将YAML映射到属性
k: v:字面直接来写;
字符串默认不用加上单引号或者双引号;
"":双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
name: "zhangsan \n lisi":输出;zhangsan 换行 lisi
'':单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
name: ‘zhangsan \n lisi’:输出;zhangsan \n lisi
k: v:在下一行来写对象的属性和值的关系;注意缩进
对象还是k: v的方式
friends:
lastName: zhangsan
age: 20
行内写法:
friends: {lastName: zhangsan,age: 18}
用- 值表示数组中的一个元素
pets:
‐ cat
‐ dog
‐ pig
行内写法
pets: [cat,dog,pig]
配置文件
person:
lastName: hello
age: 18
boss: false
birth: 2017/12/12
maps: {k1: v1,k2: 12}
lists:
‐ lisi
‐ zhaoliu
dog:
name: 小狗
age: 12
javabean
可以通过@value('${}')一个一个注入
/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中
* @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
* prefix = "person":配置文件中哪个下面的所有属性进行一一映射
*
* 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
*
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map maps;
private List
我们可以导入配置文件处理器,以后编写配置就有提示了
org.springframework.boot
spring-boot-configuration-processor
true
松散绑定:
user:
USERNAME: fztx
user:
userName: fztx
user:
user_name: fztx
user:
user-name: fztx
以上4种命名是可以自动绑定bean属性 User.username
@Value获取值和@ConfigurationProperties获取值比较
@ConfigurationProperties |
@Value |
|
绑定 |
批量注入配置文件中的属性 |
一个个指定 |
松散绑定(松散语法) |
支持 |
支持有限 |
SpEL |
不支持 |
支持 |
自动提示 |
支持 |
不支持 |
配置文件yml还是properties他们都能获取到值;
使用场景
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;
如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;
配置文件注入值数据校验
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
/**
*
*
*
*/
//lastName必须是邮箱格式
@Email
//@Value("${person.last‐name}")
private String lastName;
//@Value("#{11*2}")
private Integer age;
//@Value("true")
private Boolean boss;
private Date birth;
private Map maps;
private List
@PropertySource:加载指定的配置文件;
/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中
* @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
* prefix = "person":配置文件中哪个下面的所有属性进行一一映射
*
* 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
* @ConfigurationProperties(prefix = "person")默认从全局配置文件中获取值;
*
*/
@PropertySource(value = {"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
//@Validated
public class Person {
/**
*
*
*
*/
//lastName必须是邮箱格式
// @Email
//@Value("${person.last‐name}")
private String lastName;
//@Value("#{11*2}")
private Integer age;
//@Value("true")
private Boolean boss;
@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效;
Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;
想让Spring的配置文件生效,加载进来;@ImportResource标注在一个配置类上
@ImportResource(locations = {"classpath:beans.xml"})
导入Spring的配置文件让其生效
配置文件占位符
1、随机数
${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}
2、占位符获取之前配置的值,如果没有可以是用:指定默认值
person.last‐name=张三${random.uuid}
person.age=${random.int}
person.dog.name=${person.hello:hello}_dog