SpringBoot解析自定义yml文件的流程步骤

  目录

  背景

  公司产品微服务架构下有十几个模块,几乎大部分模块都要连接redis。每次在客户那里部署应用,都要改十几遍配置,太痛苦了。当然可以用nacos配置中心的功能,配置公共参数。不过我是喜欢在应用级别上解决问题,因为并不是每个项目都会使用nacos,做个知识储备还是不错的。

  公共配置文件位置

  启动本地redis(windows版)

  当前redis 没有数据

  初始化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 getRedisTemplate(RedisConnectionFactory factory){

  log.info("开始初始化 RedisTemplate ------------------");

  RedisTemplate 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 结束------------------");

  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();

  //文件路径写死的,真正做项目时,文件路径可以配置到application.yml文件

  FileSystemResource redisResource = new FileSystemResource("http://www.jb51.net/common-config/sf-redis.yml");

  redis.setResources(redisResource);

  configurer.setPropertiesArray(redis.getObject());

  //如果有多个配置文件,也是可以处理的。setPropertiesArray(Properties... propertiesArray)方法的参数是个数组,

  //如下还可以同时处理文件sf-ports.yml,此时configurer.setPropertiesArray(redis.getObject());代码要注释掉

  //YamlPropertiesFactoryBean ports = new YamlPropertiesFactoryBean();

  // FileSystemResource portsResource = new FileSystemResource("http://www.jb51.net/common-config/sf-ports.yml");

  // ports.setResources(portsResource);

  //同时添加sf-redis.yml和sf-ports.yml的配置信息

  // configurer.setPropertiesArray(redis.getObject(), ports.getObject());

  return configurer;

  }

  }

  应用启动类

  注意一下,因为我已经搭建了完整的微服务,包括nacos,mybatis,feign等,所有启动类上注解比较多。如果只是单纯测试一下,引入springboot基础框架和redis依赖,写一个基础启动类就可以了。

  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注册中心

  @EnableFeignClients(basePackages = {"cn.com.soulfox.common.feign.client"})//feign扫描

  @MapperScan(basePackages={"cn.com.soulfox.*.mvc.mapper"})//mybatis mapper扫描

  @EnableTransactionManagement//开启数据库事务

  @ComponentScan("cn.com.soulfox")

  public class BusinessApplicationRun {

  public static void main(String[] args) {

  SpringApplication.run(BusinessApplicationRun.class, args);

  }

  }

  启动一下应用看看redis是否初始化成功

  测试一下是否可以正常使用

  单元测试类

  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 redisTemplate;

  //文件sf-redis.yml里属性的使用和applications.yml一样

  @Value("${spring.redis.host}")

  private String redisHost;

  @Test

  public void test(){

  System.out.println("从文件取参数测试+++++++++++");

  System.out.println("redisHost: " + redisHost);

  }

  }

  测试sf-redis.yml属性使用

  使用方法和配置在application.yml文件是一样,都是通过@Value注解获取

  测试结果

  测试redis是否可以正常使用

  测试写入数据,增加以下测试方法

  @Test

  public void testRedisSetValue(){

  this.redisTemplate.opsForValue().set("test", "test123");

  }

  测试结果

  测试读取数据,增加以下测试方法

  @Test

  public void testRedisGetValue(){

  Object testValue = this.redisTemplate.opsForValue().get("test");

  System.out.println(testValue);

  }

  测试结果

  总结一下

  现在的微服务,大多使用nacos作为注册中心,同事nacos也能作为配置中心使用。公共配置一般放在nacos中,以上方法没有什么用处。但总有项目可能不会使用nacos,比如使用eureka,这时候以上方法就有用武之地。这个方法可以作为知识储备,了解一下总是有好处的 :–)

  还有一点需要注意的,就是yml文件是在程序启动后解析的,所以文件里的配置信息,在application.yml里是不能通过${xxx.xxx}使用的。

  以上就是SpringBoot解析自定义yml文件的流程步骤的详细内容,更多关于SpringBoot解析yml文件的资料请关注脚本之家其它相关文章!

  您可能感兴趣的文章: