SpringBoot读取多环境配置文件的几种方式

 更新时间:2023年10月30日 08:29:58   作者:Lxlxxx  
这篇文章主要给大家介绍了SpringBoot读取多环境配置文件的几种方式,文章通过代码示例介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下

Properties配置文件注入

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

//applicaiton.properties配置
spring.redis.host: 127.0.0.1
spring.redis.port: 3306
spring.redis.password :123456

@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机制会根据不同环境读取不同的配置文件

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

Yml的方式注入

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

//application.yml
spring:
  redis:
    host: 127.0.0.1
    port: 6379
    password: password

YamlPropertiesFactoryBean类读取

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

    @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工厂的后置处理器;

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

@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]

@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()方法 进行读取;

@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;
}

到此这篇关于SpringBoot读取多环境配置文件的几种方式的文章就介绍到这了,更多相关SpringBoot读取多环境配置文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java 添加和删除PDF图层的示例代码

    Java 添加和删除PDF图层的示例代码

    本文将介绍如何使用Spire.PDF for Java来添加和删除PDF图层,本文通过示例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-02-02
  • idea中cherry pick的用法

    idea中cherry pick的用法

    Cherry-Pick可以将一个分支的某些commit,合并到另一个分支,本文给大家分享idea中cherry pick的用法,感兴趣的朋友跟随小编一起看看吧
    2023-08-08
  • Java利用自定义注解实现数据校验

    Java利用自定义注解实现数据校验

    JSR303是一套JavaBean参数校验的标准,它提供了一系列的校验方式,这些校验方式在javax.validation.constraints包中。本文就来聊聊如何利用它实现数据校验
    2022-09-09
  • Java代码如何判断linux系统windows系统

    Java代码如何判断linux系统windows系统

    这篇文章主要介绍了Java代码如何判断linux系统windows系统问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • SpringBoot整合MybatisPlus实现增删改查功能

    SpringBoot整合MybatisPlus实现增删改查功能

    MybatisPlus是国产的第三方插件, 它封装了许多常用的CURDapi,免去了我们写mapper.xml的重复劳动。本文将整合MybatisPlus实现增删改查功能,感兴趣的可以了解一下
    2022-05-05
  • SpringBoot之使用Redis实现分布式锁(秒杀系统)

    SpringBoot之使用Redis实现分布式锁(秒杀系统)

    这篇文章主要介绍了SpringBoot之使用Redis实现分布式锁(秒杀系统),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Java中instanceof 关键字的使用

    Java中instanceof 关键字的使用

    instanceof通过返回一个布尔值来指出,某个对象是否是某个特定类或者是该特定类的子类的一个实例,本文就来详细的介绍一下instanceof 关键字的使用,感兴趣的可以了解一下
    2023-10-10
  • Java中的StringUtils引入及使用示例教程

    Java中的StringUtils引入及使用示例教程

    这篇文章主要介绍了Java中的StringUtils引入及使用示例教程,本文结合示例代码给大家介绍的非常详细,介绍了java中StringUtils用法,感兴趣的朋友跟随小编一起看看吧
    2023-01-01
  • Java分布式事务管理框架之Seata

    Java分布式事务管理框架之Seata

    这篇文章主要介绍了Java分布式事务框架Seata,分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上
    2022-07-07
  • 深入解析Java多态进阶学习

    深入解析Java多态进阶学习

    java的动态绑定机制非常重要。这篇文章将带大家更深入的学习一下Java的多态,文中的示例代码讲解详细,对我们学习Java有一定帮助,需要的可以参考一下
    2022-07-07

最新评论