在前面的章节中,我们已经学习了如何去用不同的方式去打包我们的应用和如何部署。下一步,我们需要配置我们的应用在可控制的范围还有就是环境特殊的配置参数。

这一章节,我们基于前面的章节,添加支持不同配置的文件,同时测试如何使用适当的参数作为点位符在其它适应的声明中,并且如何添加我们的PropertySource应用。

6.4.1如何使用

  1. 我们需要在src/main/java/org/owen/bookpub目录下的BookPubApplication.java中加入@Profile注解。

@Bean

@Profile("logger")

public StartupRunner schedulerRunner()

{

return new StartupRunner();

}

  1. 启动应用
  2. 一旦应用启动了,我们不可能看到先前的日志输出,如下:

2020-04-19 --- org.test.bookpub.StartupRunner : Number of
books: 1

  1. 现在,我们执行./gradle clean bootRepackage 和 启动应用 ./build/libs/bookpub-0.0.1-SNAPSHOT-exec.jar –spring.profiles.active=logger 和我们将会看到先前的那行日志输出了。
  2. 还有一种运行是通过Profile选择器能够添加Profile特殊的属性文件。让我们创建application-inmemorydb.properties文件放置到src/main/resource目录下,添加内容如下:

spring.datasource.url =
jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE

  1. 让我们创建应用./gradle clean bootRepackage 和使用命令启动,./build/libs/bookpub-0.0.1-SNAPSHOT-exe.jar –spring.profiles.active=logger,inmemorydb,这样的话,我们就是使用inmemorydb的Profile配置目的是为了使用in-memory数据库取代file-base.

在这个例子中,我们已经使用了一个特定的配置系统,Spring Boot提供我们可以通过PropertySource应用去整合这个应用。

让我们想象,我们已经有一个配置启动和使用Apache Commons Configuration框架和储蓄配置数据在XML文件中。

  1. 在build.gradle文件中加入以下的配置:

dependencies {
...
compile project(':db-count-starter')
compile("commons-configuration:commons-configuration:1.6")
compile("commons-codec:commons-codec:1.6")
compile("commons-jxpath:commons-jxpath:1.3")
compile("commons-collections:commons-collections:3.2.1")
runtime("com.h2database:h2")
...
}

  1. 在src/main/resource目录下他去简单的commons-config.xml的文件,内容如下:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<config>
<book>
<counter>
<delay>1000</delay>
<rate>${book.counter.delay}0</rate>
</counter>
</book>
</config>

  1. 接下来,我们创建PropertySource应用文件命名为ApacheCommonsConfigurationPropertySorce.java在src/main/java/owen/bookpub目录下。

public class ApacheCommonsConfigurationPropertySource extends

EnumerablePropertySource<XMLConfiguration>

{

private static final Log logger = LogFactory

.getLog(ApacheCommonsConfigurationPropertySource.class);

public static final String COMMONS_CONFIG_PROPERTY_SOURCE_NAME = "commonsConfig";

public ApacheCommonsConfigurationPropertySource(String name,

XMLConfiguration source)

{

super(name, source);

}

@Override

public String[] getPropertyNames()

{

ArrayList<String> keys = Lists.newArrayList(this.source.getKeys());

return keys.toArray(new String[keys.size()]);

}

@Override

public Object getProperty(String name)

{

return this.source.getString(name);

}

public static void addToEnvironment(ConfigurableEnvironment environment,

XMLConfiguration xmlConfiguration)

{

environment.getPropertySources().addAfter(

StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME,

new ApacheCommonsConfigurationPropertySource(

COMMONS_CONFIG_PROPERTY_SOURCE_NAME, xmlConfiguration));

logger.trace("ApacheCommonsConfigurationPropertySource add toEnvironment");

}

}

  1. 接着,我们将要创建SpringApplicationRunListener实现类名称为ApacheCommonsConfigurationApplicaitonRunnListener.java在src/main/java/org/owen/bookpub目录下,添加如下内容:

public class ApacheCommonsConfigurationApplicationRunListener implements

SpringApplicationRunListener

{

public ApacheCommonsConfigurationApplicationRunListener(

SpringApplication application, String[] args)

{

}

@Override

public void started()

{

}

@Override

public void environmentPrepared(ConfigurableEnvironment environment)

{

try

{

ApacheCommonsConfigurationPropertySource.addToEnvironment(

environment, new XMLConfiguration("commons-config.xml"));

} catch (ConfigurationException e)

{

throw new RuntimeException("Unable to load commons-config.xml", e);

}

}

@Override

public void contextPrepared(ConfigurableApplicationContext context)

{

}

@Override

public void contextLoaded(ConfigurableApplicationContext context)

{

}

@Override

public void finished(ConfigurableApplicationContext context,

Throwable exception)

{

}

}

  1. 最后,我们需要创建新的文件,名称为META-INF在src/main/resource目录下,创建名称为spring.factories,内容如下:

# Run Listeners
org.springframework.boot.SpringApplicationRunListener=\
org.test.bookpub.ApacheCommonsConfigurationApplicationRunListener

  1. 我们已经准备好参数应用到我们的应用中。让我们改变src/main/java/org/owen/bookpub下的StartuRunner的类如下:

@Scheduled(initialDelayString = "${book.counter.delay}",
fixedRateString = "${book.counter.rate}")

  1. 项目打包,然后执行: ./build/libs/bookpub-0.0.1-SNAPSHOT-exec.jar --

spring.profiles.active=logger。你还是可以看到每10秒打印一下。

6.4.2使用原理

使用@Profile(“logger”)注解时,告诉Spring创建的bean仅仅当logger被激活时。也就是我们使用—spring.profile.active命令去开启我们的应用。在测试中,我偿还可以使用另外一种方式注解在测试类中,那就是@ActiveProfiles(“profile”),当是在正常的应用中是不会执行的。它也可以忽略profile,例如@Profile(“!production”).当我们使用这个注解时,如果没有profile是激活的bean才会被创建。

在我们启动时,Spring Boot使用所有我们命令中的参数。这种方式可以覆盖已经配置好的参数。让我们想象一下这样的情况,我们在application.properties中配置了spring.profiles.active=basic,但是我们启动时却是使用了—spring.profiles.active=logger,那么logger将会取代basic.如果我们需要包含一些其它的profile,我们可以使用spring.profiles.include。

下面几个将会覆盖优先级:

  1. Command Line Arguments:这些值将会优先于其它的资源,你可以通过—property.name=value来确保其它偕优先级。
  2. JNDI Attributes:这个是次一级的优先级。如果你使用一个应用包含了数据是通过JNDI java:com/env命名空间,这个将会覆盖其它的。
  3. Java System Properties:这个是其它的方式通过配置文件到应用中,要不是通过-Dproperty=name命令或通过使用System.setProperty(…)在代码中。这个是另外一种方式去取代已经存在的属性配置。任何来自于System.getProperty(…)都会优先一其它值列表中定义的。
  4. OS Environment Variable:这些变量来自于Windows、Linux、OS X或其它的,他们一个共同的方式去指定配置,尤其是本地或值。一个普遍的是JAVA_HOME,这是一个普遍的方式去声明JVM。
  5. @Configuration 注解同时也要注解@PropertySource:任何代码属性资源都要配置这个注解。
  6. Default properties:它们通过SpringApplication.setDefaultProperties(…)配置,但是很少使用。

接下来,我们来看一下我们新创建的两个类:

  1. ApacheCommonsConfigurationPropertySource:这个是继承了EnumerablePropertySource类,这个类内部提供了连接Apache Commons Configuration的XMLConfiguration.我们可以通过getProperty(String name)来获取特殊的属性参数。或者通过getPropertyNames()来获取属性的列表。
  2. ApacheCommonConfigurationApplicationRunnListener:这个是实现SpringApplicationRunnListener的接口,这个接口由Spring Boot来提供实例。这个类配置在spring.factories的文件中,由Spring Boot来自动创建。

6.4Spring环境配置等级和优先级相关推荐

  1. linux 编译opencl,OpenCL编译环境配置(VS+Nvidia)

    英伟达的显卡首先要下载安装CUDA开发包,可以参考这里的步骤:   VS2015编译环境下CUDA安装配置 安装好CUDA之后,OpenCL的配置就已经完成了80%了,剩下的工作就是把OpenCL的路 ...

  2. 从头到尾使用Geth的说明-3-geth参数说明和环境配置

    1.参数说明 ETHEREUM选项:--config value TOML 配置文件--datadir "/home/user4/.ethereum" 数据库和keystore密钥 ...

  3. 深度学习环境配置指南!(Windows、Mac、Ubuntu全讲解)

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:伍天舟.马曾欧.陈信达 入门深度学习,很多人经历了从入门到放弃的心 ...

  4. 【深度学习】相当全面的深度学习环境配置指南!(Windows、Mac、Ubuntu全讲解)...

    作者:伍天舟.马曾欧.陈信达 入门深度学习,很多人经历了从入门到放弃的心酸历程,且千军万马倒在了入门第一道关卡:环境配置问题.俗话说,环境配不对,学习两行泪. 如果你正在面临配置环境的痛苦,不管你是W ...

  5. Nacos配置管理-多环境配置共享

    配置共享 其实微服务启动时,会去nacos读取多个配置文件,例如: [spring.application.name]-[spring.profiles.active].yaml,例如:userser ...

  6. ASP.NET Core启动地址配置方法及优先级顺序 | .NET 6 版本

    前言 上次,我们讨论了如何通过配置或代码方式修改启动地址:<ASP.NET Core启动地址配置方法及优先级顺序>.不过是基于 .NET 5 版本的. 由于 .NET 6 使用了最小 WE ...

  7. java jdk安装 win10,Win10安装多个jdk,共存环境配置,自由切换

    需求: 在不影响别的项目运行的同时,也需要支持当前的项目,于是想法是jdk 如何配置多个并且切换容易,总不能真配置两套吧:如下配置确实很节省时间! 1.删除 C:\Windows\System32 下 ...

  8. LNMP(linux+nginx+mysql+php)服务器环境配置

    LNMP(linux+nginx+mysql+php)服务器环境配置 一.简介 Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为 "engine X", ...

  9. STM32F103C8T6基础开发教程(HAL库)—开发环境配置

    STM32F103C8T6基础开发教程目录 STM32F103C8T6基础开发教程(HAL库)-开发环境配置 STM32F103C8T6基础开发教程(HAL库)-Keil添加注释的快捷键 STM32F ...

  10. 树莓派Raspberry Pico RP2040 开发环境配置完全缝合终极版C-SDK

    树莓派Raspberry Pico RP2040 开发环境配置骨灰版 总览目录 树莓派Raspberry Pico RP2040 开发环境配置骨灰版 前置说明 0.1 关于调试使用的Debugger ...

最新文章

  1. 【设计模式】—— 访问者模式Visitor
  2. 牛客网——约数的个数
  3. ajax怎么在html与php中使用,php – 如何在通过ajax加载的html中运行javascript
  4. C#制作QQ截图的自动框选功能的个人思路(三)自动框选
  5. 双层感知机解决异或问题
  6. tq2440修改默认串口不支持打印控制台
  7. 郝斌java教程下载_郝斌Java自学教程全集打包,视频教程下载
  8. (论文加源码)基于DEAP数据集的脑电情绪识别(基于FFT和CWT的CNN模型)
  9. 小米 android 7.0下载地址,小米5安卓7.0公测版固件下载地址 仅限开发版
  10. live2d碰撞_Unity Live2D 模型(与UI)拖拽功能 实现源码
  11. 【读书笔记】《人性的弱点》——卡耐基
  12. 微信标题特殊符号大全 ✔
  13. 使用.net 操作 微信公众平台 —— 接收用户操作 —— 关注/取消关注 公众号
  14. 有界面的python音乐播放器(可下载音乐)
  15. 致远SPM解决方案之费用管理
  16. 组策略中的软件限制策略
  17. 网络中国象棋小游戏的实现
  18. 最全与最好的——CUDA入门教程
  19. 视频 伪原创 教程 去除视频md5
  20. 公务员行测可以用计算机吗,公务员考试可以带计算器吗

热门文章

  1. C_Learning(3)
  2. 检测SqlServer服务器CPU是否瓶颈
  3. BGP通告路由的方法以及BGP静态路由下放
  4. 判断两字符串是否为逆序
  5. pytorch自我错误总结
  6. mysql 数据库的安装与配置 有关msi文件start service 停滞不前的问题及其解决办法
  7. 三羊献瑞——第六届蓝桥杯C语言B组(省赛)第三题
  8. Day4 单用户模式、救援模式、克隆虚拟机、linux机器相互登录
  9. 人人都能学会的python编程教程12:函数的参数
  10. HttpHandler和ashx要实现IRequiresSessionState接口才能访问Session信息(转载)