spring-boot 使用 @ConfigurationProperties 读取配置文件数据

概述

                我们知道,从spring-boot开始,已经支持yml文件形式的配置,@ConfigurationProperties的大致作用就是通过它可以把properties或者yml配置直接转成对象。


       配置文件转成对象

          Relaxed binding

                 用@ConfigurationProperties是支持“松绑定”的,我们不必每个字都和配置中的key一致。官网给出了两个例子,e.g. context-path binds to contextPath和e.g. PORT binds to port

   集合的处理

                如果在配置中需要配置集合的话,我们需要使用“-”符号

                比如:

[html]  view plain  copy
  1. poolConfig:   
  2.       - maxIdle: 8  
  3.       - minIdle: 0  
  4.       - maxActive: 8  
  5.       - maxWait: -1  

          元数据(Meta-data)

                 @ConfigurationProperties还支持spring元数据,可以在resource下建立META-INF文件夹,然后建立文件additional-spring-configuration-metadata.json。里面的数据格式必须满足spring的元数据格式http://docs.spring.io/spring-boot/docs/1.5.3.RELEASE/reference/htmlsingle/#configuration-metadata

                  接下来我们来看个例子

                  yml配置如下:

[html]  view plain  copy
  1. spring:   
  2.   redis:   
  3.     dbIndex: 0  
  4.     hostName: 192.168.58.133  
  5.     password: nmamtf  
  6.     port: 6379  
  7.     timeout: 0  
  8.     poolConfig:   
  9.       - maxIdle: 8  
  10.       - minIdle: 0  
  11.       - maxActive: 8  
  12.       - maxWait: -1  
                    

                    定义被转换的对象

[java]  view plain  copy
  1. @Component  
  2. @ConfigurationProperties(prefix="spring.redis")    
  3. public class RedisProps {  
  4.   
  5.     private int dbIndex;  
  6.     @NotNull  
  7.     private String hostname;  
  8.     private String password;  
  9.     @NotNull  
  10.     private int port;  
  11.     private long timeout;  
  12.     private List<Map<String,String>> poolConfig;  
  13.       
  14.     public int getDbIndex() {  
  15.         return dbIndex;  
  16.     }  
  17.     public void setDbIndex(int dbIndex) {  
  18.         this.dbIndex = dbIndex;  
  19.     }  
  20.     public String getHostname() {  
  21.         return hostname;  
  22.     }  
  23.     public void setHostname(String hostname) {  
  24.         this.hostname = hostname;  
  25.     }  
  26.     public String getPassword() {  
  27.         return password;  
  28.     }  
  29.     public void setPassword(String password) {  
  30.         this.password = password;  
  31.     }  
  32.     public int getPort() {  
  33.         return port;  
  34.     }  
  35.     public void setPort(int port) {  
  36.         this.port = port;  
  37.     }  
  38.     public long getTimeout() {  
  39.         return timeout;  
  40.     }  
  41.     public void setTimeout(long timeout) {  
  42.         this.timeout = timeout;  
  43.     }  
  44.     public List<Map<String, String>> getPoolConfig() {  
  45.         return poolConfig;  
  46.     }  
  47.     public void setPoolConfig(List<Map<String, String>> poolConfig) {  
  48.         this.poolConfig = poolConfig;  
  49.     }  
  50.       
  51. }  

                 这样该对象的成员变量会被自动赋值,可以在其他地方进行注入


        直接注入配置到java config中

                  如果你嫌上面还麻烦,那么接下来的这个功能绝对让你惊艳。

                  该功能在官方文档是没有提到的,我们可以把@ConfigurationProperties和@Bean和在一起使用。

                  举个例子,我们需要用@Bean配置一个Config对象,Config对象有a,b,c成员变量需要配置,那么我们只要在yml或properties中定义了a=1,b=2,c=3,然后通过@ConfigurationProperties就能把值注入进Config对象中。这是魔术吗?

                  下面我用实际的代码举个例子

                   yml配置文件修改如下

[html]  view plain  copy
  1. server:  
  2.   port: 8080  
  3.   
  4. spring:   
  5.   redis:   
  6.     dbIndex: 0  
  7.     hostName: 192.168.58.133  
  8.     password: nmamtf  
  9.     port: 6379  
  10.     timeout: 0  
  11.     poolConfig:   
  12.       maxIdle: 8  
  13.       minIdle: 0  
  14.       maxActive: 8  
  15.       maxWait: -1  

                       接着我们用@ConfigurationProperties来配置redis

[java]  view plain  copy
  1. @Configuration    
  2. @EnableAutoConfiguration  
  3. public class RedisConfig {  
  4.       
  5.     @Bean    
  6.     @ConfigurationProperties(prefix="spring.redis.poolConfig")    
  7.     public JedisPoolConfig getRedisConfig(){    
  8.         JedisPoolConfig config = new JedisPoolConfig();  
  9.         return config;    
  10.     }    
  11.         
  12.     @Bean    
  13.     @ConfigurationProperties(prefix="spring.redis")    
  14.     public JedisConnectionFactory getConnectionFactory(){    
  15.         JedisConnectionFactory factory = new JedisConnectionFactory();    
  16.         factory.setUsePool(true);  
  17.         JedisPoolConfig config = getRedisConfig();    
  18.         factory.setPoolConfig(config);    
  19.         return factory;    
  20.     }    
  21.         
  22.         
  23.     @Bean    
  24.     public RedisTemplate<?, ?> getRedisTemplate(){    
  25.         RedisTemplate<?,?> template = new StringRedisTemplate(getConnectionFactory());    
  26.         return template;    
  27.     }    
  28.       
  29. }  
                注意,其中JedisConnectionFactory中包含dbIndex,hostName,password,port,timeout,poolConfig几个成员变量。JedisPoolConfig包含maxIdle,minIdle,maxActive,maxWait几个成员变量。

       @ConfigurationProperties和@Value比较

                它们两个都能把配置文件的值直接注入到代码,那么它们的区别是什么呢,怎么选择呢,直接拿官方的表格一下就清楚了


Feature @ConfigurationProperties @Value

Relaxed binding

Yes

No

Meta-data support

Yes

No

SpEL evaluation

No

Yes


猜你喜欢

转载自blog.csdn.net/belalds/article/details/80676278
今日推荐