当前位置:   article > 正文

springboot解析自定义yml文件

springboot解析自定义yml文件

背景

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

公共配置文件位置

公共配置文件

启动本地redis(windows版)

启动redis
当前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<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 结束------------------");
        return redisTemplate;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

解析自定义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("../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("../common-config/sf-ports.yml");
//        ports.setResources(portsResource);
		//同时添加sf-redis.yml和sf-ports.yml的配置信息
//        configurer.setPropertiesArray(redis.getObject(), ports.getObject());
        return configurer;
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

应用启动类

  注意一下,因为我已经搭建了完整的微服务,包括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);
	}

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

启动一下应用看看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<String, Object> 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);
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 测试sf-redis.yml属性使用
       使用方法和配置在application.yml文件是一样,都是通过@Value注解获取
    测试结果
    在这里插入图片描述
  • 测试redis是否可以正常使用
    测试写入数据,增加以下测试方法
	@Test
    public void testRedisSetValue(){
        this.redisTemplate.opsForValue().set("test", "test123");
    }
  • 1
  • 2
  • 3
  • 4

测试结果
在这里插入图片描述
测试读取数据,增加以下测试方法

	@Test
    public void testRedisGetValue(){
        Object testValue = this.redisTemplate.opsForValue().get("test");
        System.out.println(testValue);
    }
  • 1
  • 2
  • 3
  • 4
  • 5

测试结果
在这里插入图片描述

总结一下。。。

   现在的微服务,大多使用nacos作为注册中心,同时nacos也能作为配置中心使用。公共配置一般放在nacos中,以上方法没有什么用处。但总有项目可能不会使用nacos,比如使用eureka,这时候以上方法就有用武之地。这个方法可以作为知识储备,了解一下总是有好处的 :–)
   还有一点需要注意的,就是yml文件是在程序启动后解析的,所以文件里的配置信息,在application.yml里是不能通过${xxx.xxx}使用的。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/785221
推荐阅读
相关标签
  

闽ICP备14008679号