SpringBoot之核心配置

news/2025/1/10 2:28:40 标签: spring boot, java, spring

学习目标:

        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自定义配置文件。

<?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 


http://www.niftyadmin.cn/n/5818141.html

相关文章

SQL刷题快速入门(一)

SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是用于管理和操作关系型数据库的一种标准计算机语言。SQL最初由IBM在20世纪70年代开发&#xff0c;并且自1986年以来&#xff0c;它已经被美国国家标准协会&#xff08;ANSI&#xff09;和国际…

GO:sync.Map

sync.Map 是 Go 语言 sync 包中提供的一个内置的并发安全的 map 类型。它在设计上考虑了高并发场景&#xff0c;尽量避免加锁操作从而提升读写性能。 这里是一段关于sync.map使用的简单记录 package mainimport ("fmt""sync" )func main() {var m sync.Map…

api开发如何在代码中使用京东商品详情接口的参数?

选择编程语言和相关工具 以 Python 为例&#xff0c;你可以使用requests库来发送 HTTP 请求获取接口数据。如果是 Java&#xff0c;可以使用OkHttp等库。 Python 示例 假设你已经安装了requests库&#xff0c;以下是一个简单的代码示例来获取和使用京东商品详情接口参数&#…

卷积神经网络 (CNN, Convolutional Neural Network) 算法详解与PyTorch实现

卷积神经网络 (CNN, Convolutional Neural Network) 算法详解与PyTorch实现 目录 卷积神经网络 (CNN, Convolutional Neural Network) 算法详解与PyTorch实现1. 卷积神经网络 (CNN) 算法概述1.1 图像处理1.2 CNN的优势2. CNN的核心技术2.1 卷积层2.2 池化层2.3 全连接层2.4 激活…

Solidity合约编写(五)

解决问题 编写 FundMe.sol 一个众筹合约&#xff0c;允许用户向合约转账 ETH&#xff0c;并记录每个地址的转账金额。同时&#xff0c;合约还要求每次转账至少为 1 ETH&#xff0c;否则交易失败。最后&#xff0c;合约管理员可以提取资金&#xff0c;并使用 call 函数发送 ETH…

golang中的字符串,字符串驻留 Intern,unique包

Go1.23 Go字符串 Go语言中的字符串是一个不可变的字节序列&#xff0c;这意味着一旦字符串被创建&#xff0c;其内容就不能被修改&#xff08;尽管可以通过切片、拼接等方式生成新的字符串&#xff09;。这一设计选择不仅简化了字符串的处理逻辑&#xff0c;还提高了程序的并…

Netty中用了哪些设计模式?

大家好&#xff0c;我是锋哥。今天分享关于【Netty中用了哪些设计模式&#xff1f;】面试题。希望对大家有帮助&#xff1b; Netty中用了哪些设计模式&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Netty 是一个高性能的网络通信框架&#xff0c;广泛…

【25考研】川大计算机复试情况,重点是啥?怎么准备?

24年进入复试的同学中&#xff0c;有10位同学的复试成绩为0分。具体是个人原因还是校方原因&#xff0c;还尚不明确。但是C哥提醒&#xff0c;一定要认真复习&#xff01;复试完后不要跟任何人讨论有关复试的题目及细节&#xff01; 一、复试内容 四川大学复试内容较多&#xf…