SpringBoot解析自定義yml文件的流程步驟
背景
公司產(chǎn)品微服務(wù)架構(gòu)下有十幾個(gè)模塊,幾乎大部分模塊都要連接redis。每次在客戶那里部署應(yīng)用,都要改十幾遍配置,太痛苦了。當(dāng)然可以用nacos配置中心的功能,配置公共參數(shù)。不過我是喜歡在應(yīng)用級(jí)別上解決問題,因?yàn)椴⒉皇敲總€(gè)項(xiàng)目都會(huì)使用nacos,做個(gè)知識(shí)儲(chǔ)備還是不錯(cuò)的。
公共配置文件位置

啟動(dòng)本地redis(windows版)

當(dāng)前redis 沒有數(shù)據(jù)

初始化redis
這里的初始化和正常把redis配置信息放到application.yml里的初始化是一樣的。
package cn.com.soulfox.common.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
*
* @create 2024/4/11 10:48
*/
@Configuration
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
@Slf4j
public class RedisTemplateConfig {
@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
public RedisTemplate<String, Object> getRedisTemplate(RedisConnectionFactory factory){
log.info("開始初始化 RedisTemplate ------------------");
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
// key的序列化類型
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer());
redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
redisTemplate.setConnectionFactory(factory);
log.info("初始化 RedisTemplate 結(jié)束------------------");
return redisTemplate;
}
}
解析自定義sf-redis.yml
package cn.com.soulfox.business.config;
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.io.FileSystemResource;
import org.springframework.stereotype.Component;
/**
*
* @create 2024/6/26 16:41
*/
@Configuration
public class CommonConfig {
@Bean("common-config")
public static PropertySourcesPlaceholderConfigurer properties() {
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
YamlPropertiesFactoryBean redis = new YamlPropertiesFactoryBean();
//文件路徑寫死的,真正做項(xiàng)目時(shí),文件路徑可以配置到application.yml文件
FileSystemResource redisResource = new FileSystemResource("../common-config/sf-redis.yml");
redis.setResources(redisResource);
configurer.setPropertiesArray(redis.getObject());
//如果有多個(gè)配置文件,也是可以處理的。setPropertiesArray(Properties... propertiesArray)方法的參數(shù)是個(gè)數(shù)組,
//如下還可以同時(shí)處理文件sf-ports.yml,此時(shí)configurer.setPropertiesArray(redis.getObject());代碼要注釋掉
//YamlPropertiesFactoryBean ports = new YamlPropertiesFactoryBean();
// FileSystemResource portsResource = new FileSystemResource("../common-config/sf-ports.yml");
// ports.setResources(portsResource);
//同時(shí)添加sf-redis.yml和sf-ports.yml的配置信息
// configurer.setPropertiesArray(redis.getObject(), ports.getObject());
return configurer;
}
}
應(yīng)用啟動(dòng)類
注意一下,因?yàn)槲乙呀?jīng)搭建了完整的微服務(wù),包括nacos,mybatis,feign等,所有啟動(dòng)類上注解比較多。如果只是單純測(cè)試一下,引入springboot基礎(chǔ)框架和redis依賴,寫一個(gè)基礎(chǔ)啟動(dòng)類就可以了。
package cn.com.soulfox.business;
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.PathResource;
import org.springframework.core.io.Resource;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import tk.mybatis.spring.annotation.MapperScan;
import java.io.File;
@SpringBootApplication
@EnableDiscoveryClient//nacos注冊(cè)中心
@EnableFeignClients(basePackages = {"cn.com.soulfox.common.feign.client"})//feign掃描
@MapperScan(basePackages={"cn.com.soulfox.*.mvc.mapper"})//mybatis mapper掃描
@EnableTransactionManagement//開啟數(shù)據(jù)庫事務(wù)
@ComponentScan("cn.com.soulfox")
public class BusinessApplicationRun {
public static void main(String[] args) {
SpringApplication.run(BusinessApplicationRun.class, args);
}
}
啟動(dòng)一下應(yīng)用看看redis是否初始化成功

測(cè)試一下是否可以正常使用
單元測(cè)試類
package cn.com.soulfox.common.config;
import cn.com.soulfox.business.BusinessApplicationRun;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
/**
*
* @create 2024/6/26 16:52
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = BusinessApplicationRun.class,
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class CommonConfigTest {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
//文件sf-redis.yml里屬性的使用和applications.yml一樣
@Value("${spring.redis.host}")
private String redisHost;
@Test
public void test(){
System.out.println("從文件取參數(shù)測(cè)試+++++++++++");
System.out.println("redisHost: " + redisHost);
}
}
測(cè)試sf-redis.yml屬性使用
使用方法和配置在application.yml文件是一樣,都是通過@Value注解獲取
測(cè)試結(jié)果

測(cè)試redis是否可以正常使用
測(cè)試寫入數(shù)據(jù),增加以下測(cè)試方法
@Test
public void testRedisSetValue(){
this.redisTemplate.opsForValue().set("test", "test123");
}
測(cè)試結(jié)果

測(cè)試讀取數(shù)據(jù),增加以下測(cè)試方法
@Test
public void testRedisGetValue(){
Object testValue = this.redisTemplate.opsForValue().get("test");
System.out.println(testValue);
}
測(cè)試結(jié)果

總結(jié)一下
現(xiàn)在的微服務(wù),大多使用nacos作為注冊(cè)中心,同事nacos也能作為配置中心使用。公共配置一般放在nacos中,以上方法沒有什么用處。但總有項(xiàng)目可能不會(huì)使用nacos,比如使用eureka,這時(shí)候以上方法就有用武之地。這個(gè)方法可以作為知識(shí)儲(chǔ)備,了解一下總是有好處的 :–)
還有一點(diǎn)需要注意的,就是yml文件是在程序啟動(dòng)后解析的,所以文件里的配置信息,在application.yml里是不能通過${xxx.xxx}使用的。
以上就是SpringBoot解析自定義yml文件的流程步驟的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot解析yml文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringCloud Config配置中心原理以及環(huán)境切換方式
這篇文章主要介紹了SpringCloud Config配置中心原理以及環(huán)境切換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
Java請(qǐng)求流量合并和拆分提高系統(tǒng)的并發(fā)量示例
這篇文章主要為大家介紹了Java請(qǐng)求流量合并和拆分提高系統(tǒng)的并發(fā)量示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
Spring中的事件監(jiān)聽器使用學(xué)習(xí)記錄
Spring框架中的事件監(jiān)聽機(jī)制是一種設(shè)計(jì)模式,它允許你定義和觸發(fā)事件,同時(shí)允許其他組件監(jiān)聽這些事件并在事件發(fā)生時(shí)作出響應(yīng),這篇文章主要介紹了Spring中的事件監(jiān)聽器使用學(xué)習(xí),需要的朋友可以參考下2024-07-07
Mybatis批量更新數(shù)據(jù)庫錯(cuò)誤問題
這篇文章主要介紹了Mybatis批量更新數(shù)據(jù)庫錯(cuò)誤問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
JavaWeb Session 會(huì)話管理實(shí)例詳解
這篇文章主要介紹了JavaWeb Session 會(huì)話管理的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧2016-09-09
解決SpringMVC Controller 接收頁面?zhèn)鬟f的中文參數(shù)出現(xiàn)亂碼的問題
下面小編就為大家分享一篇解決SpringMVC Controller 接收頁面?zhèn)鬟f的中文參數(shù)出現(xiàn)亂碼的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-03-03
MybatisPlus插件自動(dòng)維護(hù)更新和創(chuàng)建時(shí)間方式
這篇文章主要介紹了MybatisPlus插件自動(dòng)維護(hù)更新和創(chuàng)建時(shí)間方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04

