开发者

springboot如何获取yaml/yml(或properties)配置文件信息

开发者 https://www.devze.com 2024-11-05 10:23 出处:网络 作者: YD_1989
目录springboot项目获取配置文件信息前言1、@Autowired 注入 Environment类2、基础用法,使用@Value注解直接注入配置信息3、进阶方法(推荐使用)拓展:springboot 集成配置中心 - 以 Apollo 为例总结springboot项目
目录
  • springboot项目获取配置文件信息
    • 前言
    • 1、@Autowired 注入 Environment类
    • 2、基础用法,使用@Value注解直接注入配置信息
    • 3、进阶方法(推荐使用)
    • 拓展:springboot 集成配置中心 - 以 Apollo 为例
  • 总结

    springboot项目获取配置文件信息

    前言

    在分布式项目开发中,通常会使用配置中心(例如:Apollo 配置中心)将配置文件和项目解耦。

    为了更具灵活性,有时候需要把一些数据放在配置文件中获取,能够减少很多麻烦,这个时候就需要读取配置文件信息。

    本文结合实际开发介绍几种使用过的读取配置文件的方法。

    首先在配置文件中配置一条数据:

    spring.application.name = user-service

    1、@Autowired 注入 Environment类

    和项目中注入 service 或者 mapper 一样,声明一个 Environment 类变量,加上 @Autowire 注解。

    如下:

        @Autowired
        private Environment environment;

    该类所属包:

    import org.springframework.core.env.Environment;

    代码获取配置:

    Stphpring aandroidpplicationName = environment.getProperty("spring.application.name");

    注意:key一定要写完整,有几层就写几层,每层的名字用点分隔。

    但是,使用该方法具有一定的局限性。

    局限性1:使用在静态方法中

    如果要在静态方法中读取配置信息,不能简单的将 Environment 定义成 static 就完了,由于注入机制,注入一个静态的 bean 只会得到一个空的 bean,即变量的值为 null,一旦使用该 bean 对象就会报空指针异常。

    错误使用方法:

        @Autowired
        private static Environment environment;//只定义成静态变量,environment 只会是null
    	public static void m1(){
    		// 一旦使用environment变量就会报空指针异常
    		String applicationName = environment.getProperty("spring.application.name");	
    	}

    正确使用方法:

    1. 将 Environment 定义成 static 静态变量
    2. 加上 environment 的 getter/setter 方法
    3. 将@Autowire注解加到set方法上

    需要注意的是,只需要 get 方法是静态的即可,set 方法不要静态,否则得到的 environment 还是null。

    正确代码如下:

    	privaphpte static Environment environment;
    
        @Autowired
        public void setEnvironment(Environment environment) {
            this.environment = environment;
        }
    
        public static Environment getEnvironment() {
            return environment;
        }

    局限性2:无法直接读取自定义的Yml配置文件

    Environment 无法直接读取自定义的配置文件,需要通过增加一个配置类,将自定义的配置文件暴露到spring environment 中。

    解决方法:

    定义一个配置类,将自定义的配置文件内容加载到 Environment 中,代码如下:

    import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
    import org.springframework.core.io.ClassPathResource;
    import org.springframework.stereotype.Component;
    
    /**
     * 配置类
     * @Description 读取自定义Yml格式配置文件
     */
    @Component
    public class JdbcConfig {
        @Bean
        public PropertySourcesPlaceholderConfigurer getSqlConfigurer() {
            PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
            YamlPropertiesFactoryBean sqlConfigBean = new YamlPropertiesFactoryBean();
            sqlConfigBean.setResources(new ClassPathResource("jdbc-properties.yml"));
            configurer.setProperties(sqlConfigBean.getObject());
            return configurer;
        }
    }

    写好配置类,就可以通过注解 @Autowired 注入 Environment 类来读取自定义配置信息了。

    2、基础用法,使用@Value注解直接注入配置信息

    使用方式:

    @Value(“${xxx.xxx.xxx}”)

    代码如下:

        @Value("${spring.application.name}")
        private String applicationName;

    注意:该方法也具有上述局限性。

    3、进阶方法(推荐使用)

    定义一个工具类,使用 @Component 注解使其成为配置类,继承ApplicationRunner 重写run()方法,再注入 Environment 获取配置,这样当项目启动好之后,配置的信息就已经加载完毕,可以做到在任何地方随时随地获取配置信息。

    代码如下:

    配置类:

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.ApplicationArguments;
    import org.springframework.boot.ApplicationRunner;
    import org.springframework.core.env.Environment;
    import org.springframework.stereotype.Component;
    
    @Component
    public class BaseConfig implements ApplicationRunner {
    
        @Autowired
        private EnvironmenKyfNkIavt  environment;
    
        public static String applicationName;
    
        @Override
        public void run(ApplicationArguments args) throws Exception {
            applicationName = environment.getProperty("spring.application.name");
    
        }
    }

    使用:直接用调用工具类的静态属性即可获取配置信息。

        @PostMapping(value = "/test/config")
        public Ljavascriptist<String> testConfig() {
            List<String> list = new ArrayList<String>();
            list.add(BaseConfig.applicationName);
            return list;
        }

    postman 测试结果:

    springboot如何获取yaml/yml(或properties)配置文件信息

    拓展:springboot 集成配置中心 - 以 Apollo 为例

    微服务中会使用配置中心管理配置文件信息,springBoot 通常会和这些配置中心集成提供一些方法获取配置信息,本文以 Apollo 配置中心为例展示如何获取配置信息。

    • (1)添加依赖
    <dependency>
        <groupId>com.ctrip.framework.apollo</groupId>
        <artifactId>red-apollo-client</artifactId>
    </dependency>
    • (2)代码使用
    Config config = ConfigService.getAppConfig();// 连接到 ConfigService 的 DEV/SIT/UAT/PROD 等环境
    String applicationName = config.getProperty("spring.application.name", ""); // 获取配置信息

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号