springboot获取properties文件的配置内容(转载) - Mr_伍先生 - 博客园
- -1、使用@Value注解读取. 读取properties配置文件时,默认读取的是application.properties. //1、使用@Value注解读取. 部分放到一个单独的类A中进行读取,然后在类B中调用,则要把类A增加@Component注解,并在类B中使用@Autowired自动装配类A,代码如下.
1、使用@Value注解读取
读取properties配置文件时,默认读取的是application.properties。
application.properties:
demo.name=Name demo.age=18
Java代码:
import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class GatewayController { @Value("${demo.name}") private String name; @Value("${demo.age}") private String age; @RequestMapping(value = "/gateway") public String gateway() { return "get properties value by ''@Value'' :" + //1、使用@Value注解读取 " name=" + name + " , age=" + age; } }
运行结果:
这里,如果要把
@Value("${demo.name}") private String name; @Value("${demo.age}") private String age;
部分放到一个单独的类A中进行读取,然后在类B中调用,则要把类A增加@Component注解,并在类B中使用@Autowired自动装配类A,代码如下。
类A:
import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class ConfigBeanValue { @Value("${demo.name}") public String name; @Value("${demo.age}") public String age; }
类B:
import cn.wbnull.springbootdemo.config.ConfigBeanValue; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class GatewayController { @Autowired private ConfigBeanValue configBeanValue; @RequestMapping(value = "/gateway") public String gateway() { return "get properties value by ''@Value'' :" + //1、使用@Value注解读取 " name=" + configBeanValue.name + " , age=" + configBeanValue.age; } }
运行结果:
注意:如果@Value${}所包含的键名在application.properties配置文件中不存在的话,会抛出异常: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'configBeanValue': Injection of autowired dependencies failed;
nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'demo.name' in value "${demo.name}"
application.properties:
demo.sex=男 demo.address=山东
代码
import cn.wbnull.springbootdemo.config.ConfigBeanValue; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class GatewayController { @Autowired private ConfigBeanValue configBeanValue; @Autowired private Environment environment; @RequestMapping(value = "/gateway") public String gateway() { return "get properties value by ''@Value'' :" + //1、使用@Value注解读取 " name=" + configBeanValue.name + " , age=" + configBeanValue.age + "<p>get properties value by ''Environment'' :" + //2、使用Environment读取 " , sex=" + environment.getProperty("demo.sex") + " , address=" + environment.getProperty("demo.address"); } }
运行结果:
这里,我们在application.properties做如下配置:
server.tomcat.uri-encoding=UTF-8 spring.http.encoding.charset=UTF-8 spring.http.encoding.enabled=true spring.http.encoding.force=true spring.messages.encoding=UTF-8
重新运行结果如下:
3、使用@ConfigurationProperties注解读取
在实际项目中,当项目需要注入的变量值很多时,上述所述的两种方法工作量会变得比较大,这时候我们通常使用基于类型安全的配置方式,将properties属性和一个Bean关联在一起,即使用注解@ConfigurationProperties读取配置文件数据。
在src\main\resources下新建config.properties配置文件:
demo.phone=10086 demo.wife=self
创建ConfigBeanProp并注入config.properties中的值:
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Component; @Component @ConfigurationProperties(prefix = "demo") @PropertySource(value = "config.properties") public class ConfigBeanProp { private String phone; private String wife; public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getWife() { return wife; } public void setWife(String wife) { this.wife = wife; } }
@Component 表示将该类标识为Bean @ConfigurationProperties(prefix = "demo")用于绑定属性,其中prefix表示所绑定的属性的前缀。 @PropertySource(value = "config.properties")表示配置文件路径。 使用时,先使用@Autowired自动装载ConfigBeanProp,然后再进行取值,示例如下:
import cn.wbnull.springbootdemo.config.ConfigBeanProp; import cn.wbnull.springbootdemo.config.ConfigBeanValue; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class GatewayController { @Autowired private ConfigBeanValue configBeanValue; @Autowired private Environment environment; @Autowired private ConfigBeanProp configBeanProp; @RequestMapping(value = "/gateway") public String gateway() { return "get properties value by ''@Value'' :" + //1、使用@Value注解读取 " name=" + configBeanValue.name + " , age=" + configBeanValue.age + "<p>get properties value by ''Environment'' :" + //2、使用Environment读取 " sex=" + environment.getProperty("demo.sex") + " , address=" + environment.getProperty("demo.address") + "<p>get properties value by ''@ConfigurationProperties'' :" + //3、使用@ConfigurationProperties注解读取 " phone=" + configBeanProp.getPhone() + " , wife=" + configBeanProp.getWife(); } }
运行结果:
4.使用PropertiesLoaderUtils
app-config.properties #### 通过注册监听器(`Listeners`) + `PropertiesLoaderUtils`的方式 com.zyd.type=Springboot - Listeners com.zyd.title=使用Listeners + PropertiesLoaderUtils获取配置文件 com.zyd.name=zyd com.zyd.address=Beijing com.zyd.company=in
PropertiesListener.java 用来初始化加载配置文件
package com.zyd.property.listener; import org.springframework.boot.context.event.ApplicationStartedEvent; import org.springframework.context.ApplicationListener; import com.zyd.property.config.PropertiesListenerConfig; /** * 配置文件监听器,用来加载自定义配置文件 * * @author <a href="mailto:[email protected]">yadong.zhang</a> * @date 2017年6月1日 下午3:38:25 * @version V1.0 * @since JDK : 1.7 */ public class PropertiesListener implements ApplicationListener<ApplicationStartedEvent> { private String propertyFileName; public PropertiesListener(String propertyFileName) { this.propertyFileName = propertyFileName; } @Override public void onApplicationEvent(ApplicationStartedEvent event) { PropertiesListenerConfig.loadAllProperties(propertyFileName); } }
PropertiesListenerConfig.java 加载配置文件内容
package com.zyd.property.config; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.Map; import java.util.Properties; import org.springframework.beans.BeansException; import org.springframework.core.io.support.PropertiesLoaderUtils; /** * 第四种方式:PropertiesLoaderUtils * * @author <a href="mailto:[email protected]">yadong.zhang</a> * @date 2017年6月1日 下午3:32:37 * @version V1.0 * @since JDK : 1.7 */ public class PropertiesListenerConfig { public static Map<String, String> propertiesMap = new HashMap<>(); private static void processProperties(Properties props) throws BeansException { propertiesMap = new HashMap<String, String>(); for (Object key : props.keySet()) { String keyStr = key.toString(); try { // PropertiesLoaderUtils的默认编码是ISO-8859-1,在这里转码一下 propertiesMap.put(keyStr, new String(props.getProperty(keyStr).getBytes("ISO-8859-1"), "utf-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (java.lang.Exception e) { e.printStackTrace(); } } } public static void loadAllProperties(String propertyFileName) { try { Properties properties = PropertiesLoaderUtils.loadAllProperties(propertyFileName); processProperties(properties); } catch (IOException e) { e.printStackTrace(); } } public static String getProperty(String name) { return propertiesMap.get(name).toString(); } public static Map<String, String> getAllProperty() { return propertiesMap; } }
Applaction.java 启动类
package com.zyd.property; import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.Map; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.zyd.property.config.PropertiesListenerConfig; import com.zyd.property.listener.PropertiesListener; /** * @author <a href="mailto:[email protected]">yadong.zhang</a> * @date 2017年6月1日 下午3:49:30 * @version V1.0 * @since JDK : 1.7 */ @SpringBootApplication @RestController public class Applaction { /** * * 第四种方式:通过注册监听器(`Listeners`) + `PropertiesLoaderUtils`的方式 * * @author zyd * @throws UnsupportedEncodingException * @since JDK 1.7 */ @RequestMapping("/listener") public Map<String, Object> listener() { Map<String, Object> map = new HashMap<String, Object>(); map.putAll(PropertiesListenerConfig.getAllProperty()); return map; } public static void main(String[] args) throws Exception { SpringApplication application = new SpringApplication(Applaction.class); // 第四种方式:注册监听器 application.addListeners(new PropertiesListener("app-config.properties")); application.run(args); } }