網(wǎng)站首頁 編程語言 正文
從傳統(tǒng)的Java web到SSM框架,都是在對開發(fā)過程的簡化,后面又出現(xiàn)了SpringBoot,這就使得開發(fā)更加的簡化了。我們在使用SSM框架的時(shí)候,各種配置文件,使得Spring在某一段時(shí)間里被稱作“配置地獄”,后面為了更加簡化,就出現(xiàn)了SpringBoot,SpringBoot幫助我們做了很多的事情,使得開發(fā)更加簡化了。
下面就聊聊博主對于SpringBoot配置文件的理解(以下理解全部是基于Java語言的Maven構(gòu)建的SpringBoot工程)。
1.SpringBoot配置文件說明
SpringBoot項(xiàng)目是一個(gè)標(biāo)準(zhǔn)的Maven項(xiàng)目,它的配置文件需要放在src/main/resources/
下,其文件名必須為application
,其存在兩種文件形式,分別是properties和yaml(或者yml)文件。
properties | yaml | |
---|---|---|
語法結(jié)構(gòu) | key=value |
key: value (:和value之間需要空格) |
文件后綴 | .properties |
.yaml 或者.yml
|
如果兩種類型的配置文件同時(shí)存在,properties文件的優(yōu)先級大于yaml文件。
舉個(gè)例子,同樣是配置端口號,properties文件如下:
# 修改端口號為80
server.port=80
yaml文件如下:
# 修改端口號為80
server:
port: 80
博主更喜歡使用yaml文件作為配置文件。
2.讀取自定義配置數(shù)據(jù)
在SpringBoot項(xiàng)目的開發(fā)過程中可能會(huì)存在自定義的一些數(shù)據(jù)需要讀取到程序中,我們也能夠直接在SpringBoot的配置文件中自定義。
使用Idea新建一個(gè)SpringBoot項(xiàng)目,在pom文件中添加依賴如下:
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-configuration-processorartifactId>
<optional>trueoptional>
dependency>
然后在主啟動(dòng)類的同級目錄下建config
包,并在下面創(chuàng)建兩個(gè)類,供以使用。
Address類:
package com.ara.config;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Address {
private String province;
private String city;
private String street;
}
Student類:
package com.ara.config;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.Map;
//lombok注解
@Data
@NoArgsConstructor
@AllArgsConstructor
//將當(dāng)前類對象放在IOC容器中
@Component
//表示與配置文件中前綴為student的數(shù)據(jù)相對應(yīng)
@ConfigurationProperties(prefix = "student")
public class Student {
private int id;
private String name;
private boolean sex;
private String[] subjects;
/**
* 時(shí)間(默認(rèn)時(shí)間格式:1999/09/23)
* 可通過@DateTimeFormat注解指定
* eg: @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
*/
private Date birthday;
private Map<String,String> teachers;
private Address address;
}
然后在配置文件(application.yaml
)中寫入數(shù)據(jù)如下:
# student對象的自定義數(shù)據(jù)
student:
id: 20200729
name: Ara
sex: true
# 數(shù)組 還可以寫成如下:
# subjects: [C,C++,Java]
subjects:
- C
- C++
- Java
# 時(shí)間
birthday: 1999/09/23
# Map集合
teachers:
math: 湯老師
C: Tom
Java: jack
# 對象 對象還可以寫成如下行內(nèi)形式(注意:和value之間的空格)
# address: {province: 四川,city: 成都,street: 成華大道}
address:
province: 四川
city: 成都
street: 成華大道
# 自定義value
custom:
def:
value: 這是一個(gè)自定義的值
然后在測試類中寫入以下代碼:
//自動(dòng)注入我們提供的Student類對象
@Autowired
private Student student;
//通過${xxx.xxx}來獲取配置文件中指定key的值
@Value("${custom.def.value}")
private String value;
@Test
void contextLoads() {
System.out.println(student);
System.out.println(value);
}
然后運(yùn)行測試項(xiàng)目,發(fā)現(xiàn)控制臺(tái)打印出我們在配置文件中編寫的數(shù)據(jù):
到此,就成功的讀取到了自定義配置的數(shù)據(jù)。
3.SpringBoot的配置
除了自定義的配置,就是SpringBoot本身就有的配置。
舉個(gè)例子:
我們設(shè)置項(xiàng)目的端口號,在配置文件中寫入server.port=xxxx
,這里就是在ServerProperties類中注入了我們配置的值,打開源碼可見:
如果我們沒有進(jìn)行設(shè)置,將會(huì)使用SpringBoot提供的默認(rèn)配置。
當(dāng)然這配置還有很多,具體的可以在spring-boot-autoconfiguration-x.x.x.jar/META-INF/spring.factories
中去查看。
再舉個(gè)例子,連接數(shù)據(jù)庫的配置,我們在spring.factories
中可以看到這個(gè)類。
然后我們繼續(xù)跟進(jìn),直接查看該類的源碼:
我們發(fā)現(xiàn)該類對象出現(xiàn)在IOC容器中是有條件的,這里的@ConditionalOnXxx
就決定了該類對象是否會(huì)自動(dòng)注入到IOC容器中。
@Configuration(proxyBeanMethods = false)
//該類要在DataSource和EmbeddedDatabaseType類對象存在于IOC中才會(huì)自動(dòng)注入到IOC
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
//該類需要在IOC中沒有類型為"io.r2dbc.spi.ConnectionFactory"的bean才能被注入IOC
@ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory")
//自動(dòng)配置類
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({ DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class })
我們繼續(xù)跟進(jìn)自動(dòng)配置類DataSourceProperties.class
:
然后我們又發(fā)現(xiàn)了這個(gè)注解@ConfigurationProperties
,現(xiàn)在我們就明白了,SpringBoot的配置我們都可以通過這種方式去查看源碼和進(jìn)行自定義配置。
簡單示意圖如下:
僅僅通過這一點(diǎn)的源碼跟進(jìn),我們就發(fā)現(xiàn)了SpringBoot設(shè)計(jì)的巧妙之處,當(dāng)然這只是很淺的“皮毛”,需要更加深入理解的話,還是要花費(fèi)很深的功夫。
如有不嚴(yán)謹(jǐn)或者錯(cuò)誤的描述之處,還望大佬們能夠批評指教。
原文鏈接:https://blog.csdn.net/weixin_45935633/article/details/107671665
相關(guān)推薦
- 2023-11-15 Linux系統(tǒng)SSH客戶端斷開后保持進(jìn)程繼續(xù)運(yùn)行配置方法;Python等腳本在終端后臺(tái)運(yùn)行的方法
- 2022-11-23 GoLang?strings.Builder底層實(shí)現(xiàn)方法詳解_Golang
- 2022-09-05 Spring的 @Autowired注解底層原理
- 2022-03-11 C++實(shí)操之內(nèi)聯(lián)成員函數(shù)介紹_C 語言
- 2022-06-22 一文搞懂C++多態(tài)的用法_C 語言
- 2023-06-02 Pandas計(jì)算元素的數(shù)量和頻率的方法(出現(xiàn)的次數(shù))_python
- 2023-03-20 C#如何將DLL打包到程序中_C#教程
- 2022-04-01 k8s記一次kubelet啟動(dòng)后master無法獲取node信息
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支