SpringBoot解析自定義yml文件的流程步驟
背景
公司產(chǎn)品微服務(wù)架構(gòu)下有十幾個(gè)模塊,幾乎大部分模塊都要連接redis。每次在客戶那里部署應(yīng)用,都要改十幾遍配置,太痛苦了。當(dāng)然可以用nacos配置中心的功能,配置公共參數(shù)。不過(guò)我是喜歡在應(yīng)用級(jí)別上解決問(wèn)題,因?yàn)椴⒉皇敲總€(gè)項(xiàng)目都會(huì)使用nacos,做個(gè)知識(shí)儲(chǔ)備還是不錯(cuò)的。
公共配置文件位置
啟動(dòng)本地redis(windows版)
當(dāng)前redis 沒(méi)有數(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("開(kāi)始初始化 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//開(kāi)啟數(shù)據(jù)庫(kù)事務(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文件是一樣,都是通過(guò)@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中,以上方法沒(méi)有什么用處。但總有項(xiàng)目可能不會(huì)使用nacos,比如使用eureka,這時(shí)候以上方法就有用武之地。這個(gè)方法可以作為知識(shí)儲(chǔ)備,了解一下總是有好處的 :–)
還有一點(diǎn)需要注意的,就是yml文件是在程序啟動(dòng)后解析的,所以文件里的配置信息,在application.yml里是不能通過(guò)${xxx.xxx}使用的。
以上就是SpringBoot解析自定義yml文件的流程步驟的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot解析yml文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java 實(shí)現(xiàn)線程池任務(wù)編排的示例代碼
任務(wù)編排是將多個(gè)任務(wù)按照特定的依賴關(guān)系和執(zhí)行順序進(jìn)行組織和管理的過(guò)程,以確保任務(wù)能按預(yù)定邏輯順序高效執(zhí)行,本文就來(lái)介紹一下Java 實(shí)現(xiàn)線程池任務(wù)編排的示例代碼,感興趣的可以了解一下2024-10-10Spring如何基于aop實(shí)現(xiàn)操作日志功能
這篇文章主要介紹了Spring如何基于aop實(shí)現(xiàn)操作日志功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11springboot攔截器無(wú)法注入redisTemplate的解決方法
在工作中我們經(jīng)常需要做登錄攔截驗(yàn)證或者其他攔截認(rèn)證功能,但是在寫攔截器的時(shí)候發(fā)現(xiàn)redisTemplate一直無(wú)法注入進(jìn)來(lái),本文就詳細(xì)的介紹了解決方法,感興趣的可以了解一下2021-06-06Java輸入三個(gè)整數(shù)并把他們由小到大輸出(x,y,z)
這篇文章主要介紹了輸入三個(gè)整數(shù)x,y,z,請(qǐng)把這三個(gè)數(shù)由小到大輸出,需要的朋友可以參考下2017-02-02Spring中的@RestControllerAdvice注解使用方法解析
這篇文章主要介紹了Spring中的@RestControllerAdvice注解使用方法解析,@RestControllerAdvice是Controller的增強(qiáng) 常用于全局異常的捕獲處理 和請(qǐng)求參數(shù)的增強(qiáng),需要的朋友可以參考下2024-01-01