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;
}
相关推荐
一只小青团20 分钟前
Python之面向对象和类
java·开发语言
好奇的菜鸟21 分钟前
Spring Boot 事务失效问题:同一个 Service 类中方法调用导致事务失效的原因及解决方案
数据库·spring boot·sql
qq_529835351 小时前
ThreadLocal内存泄漏 强引用vs弱引用
java·开发语言·jvm
落笔画忧愁e1 小时前
扣子Coze飞书多维表插件添加数据记录
java·服务器·飞书
来自宇宙的曹先生1 小时前
视频网站弹幕系统简易实现
spring boot·音视频
姑苏洛言3 小时前
编写产品需求文档:黄历日历小程序
前端·javascript·后端
秋千码途3 小时前
小架构step系列08:logback.xml的配置
xml·java·logback
飞翔的佩奇3 小时前
Java项目:基于SSM框架实现的旅游协会管理系统【ssm+B/S架构+源码+数据库+毕业论文】
java·数据库·mysql·毕业设计·ssm·旅游·jsp
姑苏洛言3 小时前
搭建一款结合传统黄历功能的日历小程序
前端·javascript·后端
你的人类朋友3 小时前
🍃认识一下boomi
后端