Spring boot几种读取多环境配置文件方式

Properties配置文件注入

如果我们还在使用相对较老的Properties文件的方式,存放我们项目的配置信息,那么我们可以通过*@PropertySource*注解、配置@Value的方式读取我们resource目录下的配置文件;

yaml 复制代码
//applicaiton.properties配置
spring.redis.host: 127.0.0.1
spring.redis.port: 3306
spring.redis.password :123456
kotlin 复制代码
@Component
@PropertySources(value = "classpath:application.properties")
public class RedisProperties {
    @Value("${spring.redis.host}")
    private String host;
    @Value("${spring.redis.port}")
    private String port;
    @Value("${spring.redis.password}")
    private int password;
}

如果不想写@Value注解,可以在类头加@ConfigurationProperties(prefix = "spring.redis")注解;

不同环境文件的读取

Spring boot项目是优先读取 application.yml 或者 application.properties,profile机制会根据不同环境读取不同的配置文件

ini 复制代码
//需要我们在applicaiton.properties设置环境变量
spring.profiles.actives = dev

Yml的方式注入

如果使用yml的方式配置文件,如何实现动态注入呢?

yaml 复制代码
//application.yml
spring:
  redis:
    host: 127.0.0.1
    port: 6379
    password: password

YamlPropertiesFactoryBean类读取

可以采用Spring beans包下对yml文件配置读取的类,YamlPropertiesFactoryBean,还有一个YamlMapFactoryBean返回map集合类型的配置;

csharp 复制代码
    @GetMapping("getRedisConfig")
    public Properties getRedisConfig(){
        YamlPropertiesFactoryBean yamlProFb = new YamlPropertiesFactoryBean();
        yamlProFb.setResources(new ClassPathResource("redis-file.yml"));
        Properties properties = yamlProFb.getObject();
        System.out.println(properties.get("redis.host"));
        System.out.println(properties.get("redis.port"));
        System.out.println(properties.toString());
        return properties;
    }

PropertySourcesPlaceholderConfigurer

也可以采用PropertySourcesPlaceholderConfigurer自定义配置类,使用该类进入属性注入,这个类主要解决的是YamlPropertiesFactoryBean只限于在一个接口使用,如果在定义一个接口不用YamlPropertiesFactoryBean去加载配置类,是无法读取的; 所以我们用PropertySourcesPlaceholderConfigurer,该类是实现Aware接口,而最根本还是调BeanFactoryPostProcessor,bean工厂的后置处理器;

所以我们这么配置,就可以实现全局的配置文件属性读取;

java 复制代码
@Configuration
public class YmlRedisConfig {
    
    @Bean
    public static PropertySourcesPlaceholderConfigurer yamlConfigurer(){
        PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
        YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
        yaml.setResources(new ClassPathResource("redis-file.yml"));
        configurer.setProperties(Objects.requireNonNull(yaml.getObject()));
        return configurer;
    }
}

Environment实现属性动态注入

Spring boot在启动的时候,会构建一个org.springframework.core.env.Environment对象,用于存储配置类; 根据下图,我们可以看到最终都会去实现PropertyResolver接口;

[image:2C39516B-C70F-485E-9F88-A4A7CA7F4292-2581-00001ED1E5808FF4/4CE2B56C-5B64-4756-B38A-18BA819200E1.png]

java 复制代码
@Autowired
private Environment env;

@Bean
public DataSource dataSource() throws PropertyVetoException, SQLException {
    DruidDataSource dataSource = new DruidDataSource();
    dataSource.setUrl(env.getProperty("mysql.connection.url"));
    dataSource.setUsername(env.getProperty("mysql.connection.username"));
    dataSource.setPassword(env.getProperty("mysql.connection.password"));
    return dataSource;
}

输入、输出流原生态注入

InputStreamReader字节流读取application.propertie,Properties.load()方法 进行读取;

java 复制代码
@Bean
public Properties initRedisConfig() throws IOException {
    Properties properties =new Properties();
    InputStreamReader inputStreamReader =new InputStreamReader(
            this.getClass().getResourceAsStream("application.properties"), StandardCharsets.UTF_8);
    properties.load(inputStreamReader);
    return properties;
}
相关推荐
LUCIAZZZ10 分钟前
SkyWalking快速入门
java·后端·spring·spring cloud·微服务·springboot·skywalking
虾球xz13 分钟前
游戏引擎学习第116天
java·学习·游戏引擎
方圆想当图灵26 分钟前
高性能缓存设计:如何解决缓存伪共享问题
后端·代码规范
布谷歌1 小时前
Oops! 更改field的数据类型,影响到rabbitmq消费了...(有关于Java序列化)
java·开发语言·分布式·rabbitmq·java-rabbitmq
PXM的算法星球1 小时前
java(spring boot)实现向deepseek/GPT等模型的api发送请求/多轮对话(附源码)
java·gpt·microsoft
被程序耽误的胡先生1 小时前
java中 kafka简单应用
java·开发语言·kafka
Long_poem1 小时前
【自学笔记】Spring Boot框架技术基础知识点总览-持续更新
spring boot·笔记·后端
F20226974861 小时前
Spring MVC 对象转换器:初级开发者入门指南
java·spring·mvc
楠枬1 小时前
网页五子棋——对战后端
java·开发语言·spring boot·websocket·spring