SpringBoot之核心配置
学习目标:
1.熟悉Spring Boot全局配置文件的使用
2.掌握Spring Boot配置文件属性值注入
3.熟悉Spring Boot自定义配置
4.掌握Profile多环境配置
5.了解随机值设置以及参数间引用
1.全局配置文件
Spring Boot
使用 application.properties
或者application.yaml
的文件作为全局配置文件,该文件一般会选择 放在resources目录下
Spring Boot配置文件的命名以其格式分为两大类:
application.properites
:以键值对的形式存在的文件,其要求严格,key=value
,注意 value
后面不要留空格。
application.yaml或application.yml
:yaml
文件也是yml
文件,yml
文件层次感很强,利用缩进表示层级关系,同样也是键值对的形式:key: value
,最终形成树形结构。
1.1.properties配置文件
使用Spring Initalizr方式构建Spring Boot项目式,会在resources目录下自动生成一个空的application.properties文件,Spring Boot项目启动时会自动加载application.properties文件。
可以定义Spring Boot项目的相关属性
# 1、服务器(Server)
# 服务器IP绑定地址,如果主机有多个网卡,可以绑定一个IP地址
server.address=localhost
# Spring Boot应用监听端口
server.port=8080
# Spring Boot应用的上下文
server.servlet.context-path=/spboot01
# 会话过期时间,如果未指定持续时间后缀,则以秒为单位
server.servlet.session.timeout=30
1.2.yaml或yml配置文件
application.yaml配置文件的工作原理和application.properties是一样的,只不过yaml格式配置文件=看起来更简洁一些。
YAML文件的扩展名可以使用 .yaml 或者 .yml 。
application.yml文件使用"key:(空格) value"格式配置属性,使用缩进控制层级关系
1.2.1.value值为普通数据类型:
person:
id: 1
name: 张三
isboy: true
1.2.2.value值为数组和单列集合:
当YAML配置文件中配置的属性值为数组或单列集合类型时,主要有两种书写方式:缩进式写法和行内式写法。
(1)缩进式写法
通过“-(空格)属性值”的形式为属性赋值
person:
hobby:
- play
- read
- sleep
通过直接赋值并使用英文逗号,
分隔属性值。
person:
hobby:
play,
read,
sleep
(2)行内式写法
在YAML 配置文件中,还可以将上述缩进式写法简化为行内式写法。
person:
hobby: [play,read,sleep]
使用行内式写法设置属性值时,中括号"[]
"是可以省略的,程序会自动匹配校对属性的值。
person:
hobby: play,read,sleep
1.2.3.value值为Map集合和对象 :
当YAML配置文件中配置的属性值为Map集合或对象类型时,YAML配置文件格式同样可以分为两种书写方式:缩进式写法和行内式写法。
(1)缩进式写法:
按照YAML文件格式编写属性的赋值。
person:
map:
k1: value1
k2: value2
(2)行内式写法:
属性值要用大括号"{ }" 包含。
person:
map: {k1: value1,k2: value2}
2.配置文件属性值注入
2.1.@ConfiggurationProperties注入属性
首先创建两个实体类 Pet 和 Person
public class Pet {
private String name;
private String type;
// 并给上 Getter and Setter、toString()
}
@Component
@ConfigurationProperties(prefix="person")
public class Person {
private Integer id;
private String name;
private Boolean isboy;
private List<Object> hobby;
private Map<String,Object> map;
private Pet pet;
}
@ConfigurationProperties(prefix="person"):注解的作用是将配置文件中以 person 开头的属性值通过setter方法注入实体类对应属性中
然后在 application.yml
配置文件中编写需要对 Person
类设置的配置属性。
person:
id: 1
name: 张三
isboy: true
hobby:
play,
read,
sleep
map:
k1: value1
k2: value2
pet:
name: amy
type: cat
最后,在测试类中引入 Person
实体类 Bean
,并进行输出测试。
@Autowired
public Person person;
@Test
public void demo(){
System.out.println(person);
}
2.2.@Value注入属性
@Value注解是 Spring 框架提供的,用来读取配置文件中的属性值并逐个注入 Bean
对象的对应属性中
在 application.yml
配置文件中添加属性值初始化的配置。
student:
sid: 1
sname: 李四
hobby: play,read,write
family: father,mother
maps:
k1: value1
k2: value2
pet:
type: cat
name: jerry
然后创建Student实体类,并使用@Value的方式实现属性注入
@Component
public class Student {
@Value("${student.sid}")
private Integer sid;
@Value("${student.sname}")
private String sname;
@Value("${student.hobby}")
private List<Object> hobby;
@Value("${student.family}")
private String[] family;
private Map<String,Object> maps;
private Pet pet;
//Getter、Setter、toString
//不用Getter、Setter方法
}
最后,在测试类中引入Student实体类Bean,并进行输出测试。
@Autowired
public Student student;
@Test
public void demo(){
System.out.println(student);
}
有看到@Value注解方式跟@ConfigurationProperties有不同
3.Spring Boot自定义配置
几乎所有的配置都可以写在全局配置文件中,Spring Boot 会自动加载全局配置文件从而免除我们手动加载的烦恼。但是,如果我们自定义配置文件,Spring Boot 是无法识别这些配置文件的,此时就需要我们手动加载。
3.1.使用@PropertySource
加载配置文件
在resource目录下新建一个SmsSender.properties自定义配置文件,在该配置文件中编写需要设置的配置属性
sms-sender.defaultConnectTimeout=10000
sms-sender.defaultReadTimeout=10000
sms-sender.product=Dysmsapi
sms-sender.domain=dysmsapi.aliyuncs.com
sms-sender.regionId=cn-changsha
sms-sender.endPointName=cn-changsha
sms-sender.access-key-id=LDSIEEK2hh34P8Hx
sms-sender.access-key-secret=ntUXt8MMYl7345619JrvJNDNTwslrg
## (一般有多个键值对,此处用基本值示例)
sms-sender.sign-name-json=zking
sms-sender.template-code=SMS_147419388
## (一般有多个键值对,此处用基本值示例)
sms-sender.template-param-json=www.zking.com
## 选填的属性
sms-sender.sms-up-extend-code=888
sms-sender.out-id=
在com.zking.spboot01.config包下创建一个配置类SmsSenderConfiguration
/**
* 阿里云短信发送器配置类
*/
// 自定义配置类
@Configuration
// 开启对应配置类的属性注入功能
@EnableConfigurationProperties(SmsSenderConfiguration.class)
// 指定自定义配置文件位置和名称
@PropertySource("classpath:SmsSender.properties")
// 指定配置文件注入属性前缀
@ConfigurationProperties(prefix = "sms-sender")
@Data
public class SmsSenderConfiguration {
/**
* 选填。连接主机的超时时间(单位:毫秒) 。
*/
private String defaultConnectTimeout;
/**
* 选填。从主机读取数据的超时时间(单位:毫秒) 。
*/
private String defaultReadTimeout;
/**
* 固定值。短信API产品名称(短信产品名固定,无需修改)。
*/
private String product;
/**
* 固定值。短信API产品域名(接口地址固定,无需修改)。
*/
private String domain;
/**
* 固定值。服务器区域ID,暂时不支持多region(请勿修改)。
*/
private String regionId;
/**
* 固定值。服务器端点名称(请勿修改)。
*/
private String endPointName;
/**
* 必填。开发者accessKeyId。
*/
private String accessKeyId;
/**
* 必填。开发者accessKeySecret。
*/
private String accessKeySecret;
/**
* 必填。短信签名。
*/
private String signNameJson;
/**
* 必填。短信模板ID,发送国际/港澳台消息时,请使用国际/港澳台短信模版。
*/
private String templateCode;
/**
* 选填。短信模板变量替换JSON串.
* 友情提示:如果JSON中需要带换行符,请参照标准的JSON协议。如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为 "{\"name\":\"Tom\", \"code\":\"123456\"}" 。
* 友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败。
*/
private String templateParamJson;
/**
* 选填。上行短信扩展码,扩展码字段控制在7位或以下,无特殊需要此字段的用户请忽略此字段。
*/
private String smsUpExtendCode;
/**
* 选填。外部流水扩展字段。outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者。
*/
private String outId;
}
最后,在测试类中引入SmsSenderConfiguration类型的Bean,并进行输出测试。
@Autowired
public SmsSenderConfiguration smsSenderConfiguration;
@Test
public void demo(){
System.out.println(smsSenderConfiguration);
}
3.2.使用@ImportResource加载XML配置文件
@lmportResource
注解标注在一个配置类上, 通常放置在应用启动类上,使用时需要指定 XML
配置文件的路径和名称。
在 com.zking.spboot01.config 包下创建 SmsSenderConfiguration类。该类目前没有添加任何配置和注解,因此还无法正常被Spring Boot扫描识别。
@Data
public class SmsSenderConfiguration {
/**
* 选填。连接主机的超时时间(单位:毫秒) 。
*/
private String defaultConnectTimeout;
/**
* 选填。从主机读取数据的超时时间(单位:毫秒) 。
*/
private String defaultReadTimeout;
/**
* 固定值。短信API产品名称(短信产品名固定,无需修改)。
*/
private String product;
/**
* 固定值。短信API产品域名(接口地址固定,无需修改)。
*/
private String domain;
/**
* 固定值。服务器区域ID,暂时不支持多region(请勿修改)。
*/
private String regionId;
/**
* 固定值。服务器端点名称(请勿修改)。
*/
private String endPointName;
/**
* 必填。开发者accessKeyId。
*/
private String accessKeyId;
/**
* 必填。开发者accessKeySecret。
*/
private String accessKeySecret;
/**
* 必填。短信签名。
*/
private String signNameJson;
/**
* 必填。短信模板ID,发送国际/港澳台消息时,请使用国际/港澳台短信模版。
*/
private String templateCode;
/**
* 选填。短信模板变量替换JSON串.
* 友情提示:如果JSON中需要带换行符,请参照标准的JSON协议。如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为 "{\"name\":\"Tom\", \"code\":\"123456\"}" 。
* 友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败。
*/
private String templateParamJson;
/**
* 选填。上行短信扩展码,扩展码字段控制在7位或以下,无特殊需要此字段的用户请忽略此字段。
*/
private String smsUpExtendCode;
/**
* 选填。外部流水扩展字段。outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者。
*/
private String outId;
}
在resources目录下新建applicationContext.xml自定义配置文件。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="smsSenderConfiguration" class="com.zking.spboot01.config.SmsSenderConfiguration">
<property name="defaultConnectTimeout" value="10000" />
<property name="defaultReadTimeout" value="10000" />
<property name="product" value="Dysmsapi" />
<property name="domain" value="dysmsapi.aliyuncs.com" />
<property name="regionId" value="cn-changsha" />
<property name="endPointName" value="cn-changsha" />
<property name="accessKeyId" value="LDSIEEK2hh34P8Hx" />
<property name="accessKeySecret" value="ntUXt8MMYl7345619JrvJNDNTwslrg" />
<property name="signNameJson" value="zking" />
<property name="templateCode" value="SMS_147419388" />
<property name="templateParamJson" value="www.zking.com" />
<property name="smsUpExtendCode" value="888" />
<property name="outId" value="" />
</bean>
</beans>
由于Spring Boot 默认是无法识别XML 配置文件的,为了保证XML配置文件生效,需要在项目启动类Spboot02Application上添加@ImportResource注解来指定XML文件位置。
@SpringBootApplication
@ImportResource("classpath:applicationContext.xml")
public class Spboot01Application {
public static void main(String[] args) {
SpringApplication.run(Spboot01Application.class, args);
}
}
最后,在测试类中引入 SmsSenderConfiguration
类型的 Bean
,并进行输出测试。
@Autowired
public SmsSenderConfiguration smsSenderConfiguration;
@Test
public void demo(){
System.out.println(smsSenderConfiguration);
}
4.Profile多环境配置
4.1.Profile文件方式
application-dev.yml # 开发环境配置文件
application-test.yml # 测试环境配置文件
application-prod.yml # 生产环境配置文件
application.yml # 全局配置文件
在 resources
目录下的全局配置文件 application.yml
中配置 spring.profiles.active
属性选择性激活 Profile
文件设置。
spring: profiles: active: prod # 激活生产环境配置文件
在application-dev.yml下,每个下面都加上对应的
application: name: spboot-dev
在application-prop.yml下,
application: name: spboot-prod
在application-text.yml下,
application: name: spboot-test
启动Spring Boot 项目并查看控制台输出效果。
4.2.@Profile注解方式
在 com.zking.spboot01.config
包下创建一个用于配置数据库的接口文件 IDBConnector
。
public interface IDBConnector {
String confiure();
}
在 com.zking.spboot01.config
包下创建实现了 IDBConnector
接口的 DBConnectorDev
类并重写 configure()
方法,模拟连接配置不同的数据库环境。
@Configuration
@Profile("dev")
public class DBConnectorDev implements IDBConnector{
@Override
public String confiure() {
String msg="DEV";
System.out.println(msg);
return msg;
}
}
最后运行
@Autowired
public IDBConnector dbConnectorDev;
@Test
public void demo(){
System.out.println(dbConnectorDev.confiure());
}
5.参数间引用
在 Spring Boot 的全局配置文件application.yml中
person:
id: 1
name: 张三
isboy: true
hobby:
play,
read,
sleep
map:
k1: value1
k2: value2
pet:
name: amy
type: cat
student:
sid: 1
sname: ${person.name}
hobby: play,read,write
family: father,mother
maps:
k1: value1
k2: value2
pet:
type: cat
name: jerry
Student中的sname引用的是person中的name,我们运行一下看Student中的sname是不是person的name
@Autowired
public Student student;
@Test
public void demo(){
System.out.println(student);
}
这是最基本的引用方式了
本期就到这里结束了,再见ヾ(≧▽≦*)o