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.ymlyaml文件也是yml文件,yml文件层次感很强,利用缩进表示层级关系,同样也是键值对的形式:key: value ,最终形成树形结构。

1.1.properties配置文件

使用Spring Initalizr方式构建Spring Boot项目式,会在resources目录下自动生成一个空的application.properties文件,Spring Boot项目启动时会自动加载application.properties文件。

可以定义Spring Boot项目的相关属性

java 复制代码
# 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值为普通数据类型:

java 复制代码
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

java 复制代码
public class Pet {
    private String name;
    private String type;
 	// 并给上 Getter and Setter、toString()   
}
java 复制代码
@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 类设置的配置属性。

java 复制代码
person:
  id: 1
  name: 张三
  isboy: true
  hobby:
    play,
    read,
    sleep
  map:
    k1: value1
    k2: value2
  pet:
    name: amy
    type: cat

最后,在测试类中引入 Person 实体类 Bean,并进行输出测试。

java 复制代码
    @Autowired
	public Person person;

	@Test
	public void demo(){
		System.out.println(person);
	}

2.2.@Value注入属性

@Value注解是 Spring 框架提供的,用来读取配置文件中的属性值并逐个注入 Bean 对象的对应属性中

application.yml 配置文件中添加属性值初始化的配置。

java 复制代码
student:
  sid: 1
  sname: 李四
  hobby: play,read,write
  family: father,mother
  maps:
    k1: value1
    k2: value2
  pet:
    type: cat
    name: jerry

然后创建Student实体类,并使用@Value的方式实现属性注入

java 复制代码
@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,并进行输出测试。

java 复制代码
    @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自定义配置文件,在该配置文件中编写需要设置的配置属性

java 复制代码
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

java 复制代码
/**
 * 阿里云短信发送器配置类
 */
// 自定义配置类
@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,并进行输出测试。

java 复制代码
    @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扫描识别。

java 复制代码
@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自定义配置文件。

html 复制代码
<?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文件位置。

java 复制代码
@SpringBootApplication
@ImportResource("classpath:applicationContext.xml")
public class Spboot01Application {
	public static void main(String[] args) {
		SpringApplication.run(Spboot01Application.class, args);
	}
}

最后,在测试类中引入 SmsSenderConfiguration 类型的 Bean,并进行输出测试。

java 复制代码
	@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

java 复制代码
public interface IDBConnector {
    String confiure();
}

com.zking.spboot01.config 包下创建实现了 IDBConnector 接口的 DBConnectorDev类并重写 configure()方法,模拟连接配置不同的数据库环境。

java 复制代码
@Configuration
@Profile("dev")
public class DBConnectorDev implements IDBConnector{
    @Override
    public String confiure() {
        String msg="DEV";
        System.out.println(msg);
        return msg;
    }
}

最后运行

java 复制代码
    @Autowired
	public IDBConnector dbConnectorDev;

	@Test
	public void demo(){
		System.out.println(dbConnectorDev.confiure());
	}

5.参数间引用

在 Spring Boot 的全局配置文件application.yml中

java 复制代码
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

java 复制代码
    @Autowired
	public Student student;

	@Test
	public void demo(){
		System.out.println(student);
	}

这是最基本的引用方式了

本期就到这里结束了,再见ヾ(≧▽≦*)o

相关推荐
李慕婉学姐4 小时前
【开题答辩过程】以《基于JAVA的校园即时配送系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·开发语言·数据库
奋进的芋圆6 小时前
Java 延时任务实现方案详解(适用于 Spring Boot 3)
java·spring boot·redis·rabbitmq
sxlishaobin6 小时前
设计模式之桥接模式
java·设计模式·桥接模式
model20056 小时前
alibaba linux3 系统盘网站迁移数据盘
java·服务器·前端
荒诞硬汉6 小时前
JavaBean相关补充
java·开发语言
提笔忘字的帝国6 小时前
【教程】macOS 如何完全卸载 Java 开发环境
java·开发语言·macos
2501_941882487 小时前
从灰度发布到流量切分的互联网工程语法控制与多语言实现实践思路随笔分享
java·开发语言
華勳全栈7 小时前
两天开发完成智能体平台
java·spring·go
alonewolf_997 小时前
Spring MVC重点功能底层源码深度解析
java·spring·mvc
沛沛老爹7 小时前
Java泛型擦除:原理、实践与应对策略
java·开发语言·人工智能·企业开发·发展趋势·技术原理