[十六]SpringBoot 之 读取环境变量和绑定属性对象
1.读取环境变量
凡是被spring管理的类,实现接口EnvironmentAware 重写方法 setEnvironment 可以在工程启动时,获取到系统环境变量和application配置文件中的变量。
主要是@Configuration,实现接口:EnvironmentAware就能获取到系统环境信息
package me.shijunjie.config; import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.bind.RelaxedPropertyResolver;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment; @Configuration
public class MyEnvironmentAware implements EnvironmentAware { @Value("${spring.datasource.url}")
private String url; @Override
public void setEnvironment(Environment env) {
//打印注入的属性信息.
System.out.println(url);
//通过 environment 获取到系统属性.
System.out.println(env.getProperty("JAVA_HOME"));
//通过 environment 同样能获取到application.properties配置的属性.
System.out.println(env.getProperty("spring.datasource.url"));
//获取到前缀是"spring.datasource." 的属性列表值.
RelaxedPropertyResolver relaxedPropertyResolver = new RelaxedPropertyResolver(env, "spring.datasource.");
System.out.println("spring.datasource.url="+relaxedPropertyResolver.getProperty("url"));
System.out.println("spring.datasource.driverClassName="+relaxedPropertyResolver.getProperty("driverClassName"));
} }
启动应用
@Controller@Service 等被Spring管理的类都支持,注意重写的方法setEnvironment 是在系统启动的时候被执行。
或者如下Controller:
package me.shijunjie.controller; import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
@RequestMapping("/test2")
public class TestController implements EnvironmentAware { /*@Resource(name="TestAutoConfiguration2")
private TestAutoConfiguration testAutoConfiguration;*/ @Override
public void setEnvironment(Environment env) {
String s= env.getProperty("JAVA_HOME");
System.out.println("JAVA_HOME2"+s);
} @RequestMapping("/hello")
public String test() { /*System.out.println(testAutoConfiguration.getDataSourceProperties().getName());
System.out.println(testAutoConfiguration.getDataSourceProperties().getPassword());
System.out.println(testAutoConfiguration.getDataSourceProperties().getUrl());*/
return "hello";
} }
启动应用
2.绑定属性对象
我们还可以通过@ConfigurationProperties 读取application属性配置文件中的属性。
package me.shijunjie.config; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import me.shijunjie.properties.DataSourceProperties; @Configuration
@ConditionalOnClass(DataSourceProperties.class)
@EnableConfigurationProperties(DataSourceProperties.class)
public class TestAutoConfiguration {
@Autowired
private DataSourceProperties dataSourceProperties; @Bean(name="TestAutoConfiguration2")
public TestAutoConfiguration setTestAutoConfiguration() {
return this;
} public DataSourceProperties getDataSourceProperties() {
return dataSourceProperties;
} public void setDataSourceProperties(DataSourceProperties dataSourceProperties) {
this.dataSourceProperties = dataSourceProperties;
} }
package me.shijunjie.properties; import org.springframework.boot.context.properties.ConfigurationProperties; @ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceProperties {
private String url;
private String name = "testName";
private String password;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
} }
@ConditionOnClass表明该@Configuration仅仅在一定条件下才会被加载,这里的条件是DataSourceProperties.class位于类路径上
@EnableConfigurationProperties将Spring Boot的配置文件(application.properties)中的spring.datasource.*属性映射为DataSourceProperties并注入到TestAutoConfiguration中。
@ConditionalOnMissingBean说明Spring Boot仅仅在当前上下文中不存在指定对象时,才会实例化一个Bean。这个逻辑也体现了Spring Boot的另外一个特性——自定义的Bean优先于框架的默认配置,我们如果显式的在业务代码中定义了一个对象,那么Spring Boot就不再创建。
测试
package me.shijunjie.controller; import javax.annotation.Resource; import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import me.shijunjie.config.TestAutoConfiguration; @RestController
@RequestMapping("/test2")
public class TestController implements EnvironmentAware { @Resource(name="TestAutoConfiguration2")
private TestAutoConfiguration testAutoConfiguration; @Override
public void setEnvironment(Environment env) {
String s= env.getProperty("JAVA_HOME");
System.out.println("JAVA_HOME2"+s);
} @RequestMapping("/hello")
public String test() { System.out.println(testAutoConfiguration.getDataSourceProperties().getName());
System.out.println(testAutoConfiguration.getDataSourceProperties().getPassword());
System.out.println(testAutoConfiguration.getDataSourceProperties().getUrl());
return "hello";
} }
打开浏览器,输入地址http://localhost:8080/test2/hello
这里告诉我们DataSourceProperties就是以spring.datasource作为前缀的属性,然后通过名字直接映射为对象的属性,同时还包含了一些默认值。如果不配置,那么spring.datasource.username就是jdbc:mysql://123.206.228.200:3306/test
网上资料上写绑定属性对象需要添加依赖(我没有加)
<!--spring-boot-configuration:springboot 配置处理器; -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
这边是我的application.properties文件
########################################################
###datasource
########################################################
spring.datasource.url = jdbc:mysql://123.206.228.200:3306/test
spring.datasource.username = shijunjie
spring.datasource.password = *****
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.max-active=20
spring.datasource.max-idle=8
spring.datasource.max-maxWait=100
spring.datasource.min-idle=8
spring.datasource.initial-size=10
[十六]SpringBoot 之 读取环境变量和绑定属性对象的更多相关文章
- 20.SpringBoot 之 读取环境变量和绑定属性对象
转自:https://blog.csdn.net/catoop/article/details/50548009
- 十五、Spring Boot 环境变量读取 和 属性对象的绑定
凡是被spring管理的类,实现接口 EnvironmentAware 重写方法 setEnvironment 可以在工程启动时,获取到系统环境变量和application配置文件中的变量. 如: @ ...
- [CentOS] 解决 crontab 无法读取环境变量的问题
参考资料:http://blog.slogra.com/post-238.html 1. 问题描述 一段数据处理的 shell 程序,在 shell 中手动运行,可以正确执行.但是,把它放在 cron ...
- crontab读取环境变量方法
crontab如果不注意的话早晚会出问题,而且这种问题一旦出一次,就会永远记得,因为这种问题很折腾人. ...
- python 读取环境变量
python 读取环境变量 前言 在使用python时候千万不要把账户密令直接写入脚本,特别是当你计划开源自己的作品时. 为了保护账户信息,你需要让脚本从环境中导入敏感信息. 读取方法 import ...
- EF+LINQ事物处理 C# 使用NLog记录日志入门操作 ASP.NET MVC多语言 仿微软网站效果(转) 详解C#特性和反射(一) c# API接受图片文件以Base64格式上传图片 .NET读取json数据并绑定到对象
EF+LINQ事物处理 在使用EF的情况下,怎么进行事务的处理,来减少数据操作时的失误,比如重复插入数据等等这些问题,这都是经常会遇到的一些问题 但是如果是我有多个站点,然后存在同类型的角色去操作 ...
- Java开发学习(三十六)----SpringBoot三种配置文件解析
一. 配置文件格式 我们现在启动服务器默认的端口号是 8080,访问路径可以书写为 http://localhost:8080/books/1 在线上环境我们还是希望将端口号改为 80,这样在访问的时 ...
- mac os x10.11.2系统eclipse无法读取环境变量的问题
eclipse调试Android自动化脚本的时候一直无法找到adb,遇到这么坑的问题,折腾死了,记录一下. mac os x10.11.2系统GUI程序(eclipse)无法读取~/.bash_pro ...
- java 读取环境变量和系统变量的方法
在web开发的过程中不免需要读取一些自定义的jvm系统变量或者环境变量.比如定义一些通用的log文件.或者数据库访问路径. 我们可以使用System.getProperties()读取所有的系统变量. ...
随机推荐
- RHSCA模拟考试
开始考试:桌面是个黑框子 点击reboot按钮,破解密码 开机成功,输入startx进入图形界面 不能复制,要在物理机用ssh root@172.25.0.11 远程连接,就可以复制粘贴了 * Hos ...
- CF 1083 B. The Fair Nut and Strings
B. The Fair Nut and Strings 题目链接 题意: 在给定的字符串a和字符串b中找到最多k个字符串,使得不同的前缀字符串的数量最多. 分析: 建出trie树,给定的两个字符串就 ...
- underscore.js 分析 第四天
查看underscore包含多少属性和方法 通过阅读JavaScript 获取对象的键的数组 var a = _; var arr = Object.keys(a); console.log(arr) ...
- python全栈开发-前方高能-函数进阶
python_day_10 一.今日主要内容 1. 动态参数 位置参数的动态参数: *args 关键字参数的动态参数 : **kwargs 顺序: 位置,*args,默认值,**kwargs 在形参上 ...
- 测试基础-http协议(转)
HTTP的特性 HTTP构建于TCP/IP协议之上,默认端口号是80 HTTP是无连接无状态的 HTTP报文 请求报文 HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规 ...
- youtube高清视频下载方法
youtube下载方法有多种, 但都不支持1080P以上的高清下载, 今天找到一种支持1080P的, 记录一下 步骤1: 百度搜: Dooseen tubedown 下载该软件, 并安装, 一直下一步 ...
- python的pip升级问题
近来由于pip升级为10.0.1了,导致使用pip命令报错,使用过很多方法,最终找到一种相对靠谱的方法,一下是步骤: 进入https://pypi.python.org/pypi/pip 下载pip- ...
- 人脸检测及识别python实现系列(6)——终篇:从实时视频流识别出“我”
人脸检测及识别python实现系列(6)——终篇:从实时视频流识别出“我” 终于到了最后一步,激动时刻就要来临了,先平复一下心情,把剩下的代码加上,首先是为Model类增加一个预测函数: #识别人脸 ...
- Unity编辑器扩展 Chapter3--Create Custom Inspector
一.Create Custom Inspector 重绘inspector面板一方面是我们的挂在脚本的窗口变得友好,另一方面可以让其变得更强大,比如添加一些有效性验证. 二.重要说明 1.Editor ...
- python-__getattr__ 和 __getattribute__
python3完全使用了新式类,废弃了旧式类,getattribute作为新式类的一个特性有非常奇妙的作用.查看一些博客和文章后,发现想要彻底理解getattr和getattribute的区别,实际上 ...