Spring Boot中读取配置属性的几种方式

前言

  本文介绍Spring Boot中读取配置属性的几种方式,项目示例中用到的application.ymlapplication.properties定义如下:

application.yml

application.properties

@Value

  @Value是比较常见的注入方式,功能强大但一般可读性较差。

    @Value("str")
    private String str; // 注入普通字符串
  
    @Value("${hello}")
    private String hello; // 注入配置属性

    @Value("#{systemProperties['os.name']}")
    private String systemPropertiesName; // 注入操作系统属性

    @Value("#{ T(java.lang.Math).random() * 100.0 }")
    private double randomNumber; //注入表达式结果

    @Value("#{userBean.name}")
    private String name; // 注入Bean属性

  下面通过@Value注解获取定义在配置文件的属性值:

  @SpringBootApplication
  public class AttributeApplication {

    private static final String SPRING_BOOT_HELLO = "spring-boot.hello";

    @Value("${" + SPRING_BOOT_HELLO + "}")
    private String hello;

    /**
     * 1. 通过@Value注解获取值
     */
    public void getAttrByValueAnnotation() {
      System.out.println("1. 通过@Value注解获取值: " + hello);
    }

    public static void main(String[] args) {
      ConfigurableApplicationContext applicationContext = SpringApplication.run(AttributeApplication.class, args);
      AttributeApplication bean = applicationContext.getBean(AttributeApplication.class);
      bean.getAttrByValueAnnotation();
    }
    
  }

  扩展说明:

   @SpringBootApplication
   public class AttributeApplication {
   
     private static final String SPRING_BOOT_STR_ARRAY = "spring-boot.str-array";
     private static final String SPRING_BOOT_INT_ARRAY = "spring-boot.int-array";

     /**
     * Attention : it is error if use Integer[]
     */
    @Value("${" + SPRING_BOOT_INT_ARRAY + "}")
    private int[] array;

    /**
     * 通过@Value注解获取数组
     */
    public void getArrayAttr() {
      System.out.println("5. 通过@Value注解获取数组: " + Arrays.toString(array));
    }

    @Value("#{'${" + SPRING_BOOT_STR_ARRAY + "}'.split(',')}")
    private List<String> list;

    /**
     * 通过@Value注解获取List
     */
    public void getListAttr() {
      System.out.println("6. 通过@Value注解获取List: " + list.toString());
    }
    
    public static void main(String[] args) {
      ConfigurableApplicationContext applicationContext = SpringApplication.run(AttributeApplication.class, args);
      AttributeApplication bean = applicationContext.getBean(AttributeApplication.class);
      bean.getArrayAttr();
          bean.getListAttr();
    }
    
  }

Environment

  通过注入获取Environment对象,然后再获取定义在配置文件的属性值:

  @SpringBootApplication
  public class AttributeApplication {

    private static final String SPRING_BOOT_HELLO = "spring-boot.hello";

    @Resource
    private Environment environment;

     /**
     * 2. 通过注入Environment获取值
     */
    public void getAttrByEnvironment() {
      String property = environment.getProperty(SPRING_BOOT_HELLO);
      System.out.println("2-1. 通过注入Environment获取值: " + property);
    }
    
    public static void main(String[] args) {
      ConfigurableApplicationContext applicationContext = SpringApplication.run(AttributeApplication.class, args);
      AttributeApplication bean = applicationContext.getBean(AttributeApplication.class);
      bean.getAttrByEnvironment();
    }

  }

  还可以在启动类中通过ApplicationContext获取Environment对象后再获取值:

  @SpringBootApplication
  public class AttributeApplication {
  
    private static final String UNDEFINED = "undefined";
    private static final String SPRING_BOOT_HELLO = "spring-boot.hello";
  
      public static void main(String[] args) {
      ConfigurableApplicationContext applicationContext = SpringApplication.run(AttributeApplication.class, args);
      System.out.println("2-2. 通过ApplicationContext获取Environment后再获取值: " + applicationContext
                      .getEnvironment().getProperty(SPRING_BOOT_HELLO, UNDEFINED));
    }
  
  }

@ConfigurationProperties

  @ConfigurationProperties作用在类上,用于注入Bean属性,然后再通过当前Bean获取注入值:

  @SpringBootApplication
  public class AttributeApplication {

    private static final String APPLICATION_YML = "application.yml";
    private static final String SPRING_BOOT_PREFIX = "spring-boot";

    @Data
    @Component
    @PropertySource("classpath:" + APPLICATION_YML)
    @ConfigurationProperties(prefix = SPRING_BOOT_PREFIX)
    class Attribute {

      private String hello;
      private String world;

    }

    @Resource
    private Attribute attribute;

    /**
     * 3. 通过@ConfigurationProperties注入对象属性获取
     */
    public void getAttrByConfigurationPropertiesAnnotation() {
      System.out.println("3. 通过@ConfigurationProperties注入对象属性获取: " + attribute);
    }
    
    public static void main(String[] args) {
      ConfigurableApplicationContext applicationContext = SpringApplication.run(AttributeApplication.class, args);
      AttributeApplication bean = applicationContext.getBean(AttributeApplication.class);
      bean.getAttrByConfigurationPropertiesAnnotation();
    }
    
  }

PropertiesLoaderUtils

  @SpringBootApplication
  public class AttributeApplication {
  
      private static final String UNDEFINED = "undefined";
      private static final String APPLICATION_PROPERTIES = "application.properties";
       private static final String SPRING_BOOT_HELLO = "spring-boot.hello";

    /**
     * 4. 通过PropertiesLoaderUtils获取(注意,此工具类仅可处理.properties或.xml配置文件)
     */
    public void getAttrByPropertiesLoaderUtils() {
      try {
        ClassPathResource resource = new ClassPathResource(APPLICATION_PROPERTIES);
        Properties properties = PropertiesLoaderUtils.loadProperties(resource);
        String property = properties.getProperty(SPRING_BOOT_HELLO, UNDEFINED);
        System.out.println("4. 通过PropertiesLoaderUtils获取: " + property);
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    
    public static void main(String[] args) {
      ConfigurableApplicationContext applicationContext = SpringApplication.run(AttributeApplication.class, args);
      AttributeApplication bean = applicationContext.getBean(AttributeApplication.class);
      bean.getAttrByPropertiesLoaderUtils();
    }

  }

说明

源码地址

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Spring相关

第11章—使用对象关系映射持久化数据—SpringBoot+SpringData+Jpa进行查询修改数据库

JPA由EJB 3.0软件专家组开发,作为JSR-220实现的一部分。但它又不限于EJB 3.0,你可以在Web应用、甚至桌面应用中使用。JPA的宗旨是为POJ...

1073
来自专栏JavaEdge

遨游springmvc之HandlerExceptionResolver1.前言2.原理4.总结

4655
来自专栏Ryan Miao

shell模板变量替换

我们经常使用一些模板语言来处理一些变量替换。比如jsp,php,velocity,freemarker,thymeleaf等。那对于shell来说,应该怎样替换...

1293
来自专栏小樱的经验随笔

Codeforces 833E Caramel Clouds

E. Caramel Clouds time limit per test:3 seconds memory limit per test:256 megaby...

3407
来自专栏菩提树下的杨过

velocity模板引擎学习(3)-异常处理

按上回继续,前面写过一篇Spring MVC下的异常处理、及Spring MVC下的ajax异常处理,今天看下换成velocity模板引擎后,如何处理异常页面:...

2198
来自专栏一个会写诗的程序员的博客

8.4 Spring Boot集成Kotlin混合Java开发

本章介绍Spring Boot集成Kotlin混合Java开发一个完整的spring boot应用:Restfeel,一个企业级的Rest API接口测试平台(...

2932
来自专栏Linyb极客之路

在Spring Boot中读取application.properties

通过这篇简短的博客文章,我将与您分享一些可以从Spring Boot中的application.properties文件中读取应用程序属性的方法。 我将分享3种...

3064
来自专栏大神带我来搬砖

Spring mvc中统一对ResponseBody进行封装

在一个前后端分离的项目中,需要对后端RestController里返回的ResponseBody进行统一的封装,让所有的API结果的都是json对象,带有是否成...

1062
来自专栏nice_每一天

[搜索]ElasticSearch Java Api(一) -添加数据创建索引

转载:http://blog.csdn.net/napoay/article/details/51707023

1.2K4
来自专栏一个会写诗的程序员的博客

13.1 Spring MVC 关于controller的字符编码13.1 Spring MVC 关于controller的字符编码问题描述原因分析

在使用springMVC框架构建web应用,返回http请求json格式的数据,中文乱码。

751

扫码关注云+社区

领取腾讯云代金券