[十六]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"));
    }

}

启动应用

@[email protected] 等被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

时间: 2024-10-03 19:46:20

[十六]SpringBoot 之 读取环境变量和绑定属性对象的相关文章

十五、Spring Boot 环境变量读取 和 属性对象的绑定

凡是被spring管理的类,实现接口 EnvironmentAware 重写方法 setEnvironment 可以在工程启动时,获取到系统环境变量和application配置文件中的变量. 如: @Configuration public class MyWebAppConfigurer implements EnvironmentAware { private static final Logger logger = LoggerFactory.getLogger(MyWebAppConfi

[CentOS] 解决 crontab 无法读取环境变量的问题

参考资料:http://blog.slogra.com/post-238.html 1. 问题描述 一段数据处理的 shell 程序,在 shell 中手动运行,可以正确执行.但是,把它放在 crontab 列表里,就会报错,提示 "matlab: command not found.". AutoRefreshData.sh 的部分内容如下: [[email protected] ~]$ cat /home/She/data/AutoRefreshData.sh#!/bin/bash

python 读取环境变量

python 读取环境变量 前言 在使用python时候千万不要把账户密令直接写入脚本,特别是当你计划开源自己的作品时. 为了保护账户信息,你需要让脚本从环境中导入敏感信息. 读取方法 import os os.environ["EMAIL_PASSWORD"] window环境 Linux环境 原文地址:https://www.cnblogs.com/yywBlogW/p/11438410.html

java 读取环境变量和系统变量的方法

在web开发的过程中不免需要读取一些自定义的jvm系统变量或者环境变量.比如定义一些通用的log文件.或者数据库访问路径. 我们可以使用System.getProperties()读取所有的系统变量.通过System.getProperty("name");获取特定的系统变量 System.getenv();获取环境变量.System.getenv("name")获取特定的环境变量

mac os x10.11.2系统eclipse无法读取环境变量的问题

eclipse调试Android自动化脚本的时候一直无法找到adb,遇到这么坑的问题,折腾死了,记录一下. mac os x10.11.2系统GUI程序(eclipse)无法读取~/.bash_profile下配置的环境变量. 需要用终端open /User/sun/tools/eclipse/eclipse启动,才会加载环境变量,手动启动则不加载.

【Tomcat】直接启动tomcat时为tomcat指定JDK 而不是读取环境变量中的配置

在windows环境下以批处理文件方式启动tomcat,只要运行<CATALINA_HOME>/bin/startup.bat这个文件,就可以启动Tomcat.在启动时,startup.bat会调用catalina.bat文件,而catalina.bat会调用setclasspath.bat文件来获取JAVA_HOME和JRE_HOME这两个环境变量的值,因此若要在tomcat启动时指向特定的JDK,则需在setclasspath.bat文件的开头处加入以下内容: rem ----------

Hadoop读取环境变量及setup函数

setup 函数原码:(摘自<hadoop实战>)*Called once at the start of the task. protected void setup(Context context) throws IOException,InterruptedException{} 从注释可得知,setup函数在Task启动时就调用. 在MapReduce中作业会被组织成MapTask和ReduceTask. 每个Task都以Map类或Reduce类为处理方法主体, 输入分片为处理方法的输

[ExtJS5学习笔记]第十六节 Extjs5使用panel新增的ViewModel属性绑定数据

本文地址:http://blog.csdn.net/sushengmiyan/article/details/39078627 sencha官方API:http://docs.sencha.com/extjs/5.0/apidocs/#!/api/Ext.panel.Panel-cfg-viewModel 本文作者:sushengmiyan ------------------------------------------------------------------------------

聊聊默认支持的各种配置源[内存变量,环境变量和命令行参数]

聊聊默认支持的各种配置源[内存变量,环境变量和命令行参数] 较之传统通过App.config和Web.config这两个XML文件承载的配置系统,.NET Core采用的这个全新的配置模型的最大一个优势就是针对多种不同配置源的支持.我们可以将内存变量.命令行参数.环境变量和物理文件作为原始配置数据的来源,如果采用物理文件作为配置源,我们可以选择不同的格式(比如XML.JSON和INI等) .如果这些默认支持的配置源形式还不能满足你的需求,我们还可以通过注册自定义ConfigurationSour