Spring Boot和多模块项目–添加模块特定的属性文件

你好!

在本文中,我将向您展示几种如何在Spring Boot项目中添加模块特定的属性文件的方法。 它将介绍使属性文件可识别配置文件的手动方法以及可识别配置文件的半自动方法。 我的Github帐户上发布了一个示例项目( https://github.com/coders-kitchen/spring-boot-multi-module-property-files )。

在多模块项目中每个模块具有专用属性文件的原因有很多。 一种是您希望能够轻松地将模块切成自己的服务。 每个模块都有自己的属性文件,这将对您有所帮助,因为它使用户清楚地知道,他只需要从模块中提取所有文件以使其独立即可。 或者您想为每个模块指定默认值,这些默认值可以被主要属性覆盖。

通常有三种选择

  • 通过活动配置文件指定其他属性文件
  • 在使用@PropertySource批注的模块中设置配置
  • 使Spring上下文了解其他文件模式

让我们一个接一个地讨论:

通过活动配置文件指定的属性文件

这种方法使用Spring的活动配置文件机制来激活其他属性文件。 例如,活动的本地配置文件还将从文件application-local.properties中读取设置。

这种方法的好处是,您只需使用标准机制就可以为每个模块添加新的属性文件。 可以在主application.properties或专用application- <profile> .properties文件中指定它们。

缺点是您必须记住每次都必须以正确的顺序添加活动配置文件,例如,配置文件module1必须在module1-production之前出现,以允许后者覆盖默认配置文件。

另外,您必须记住,默认配置文件需要在所有环境(也称为配置文件)中应用,以使默认设置可用。

通过@PropertySource手册

Spring本身附带了一个注释,用于将其他属性文件添加到上下文中。 它称为@PropertySource ,可以在类级别使用(请参见下一个示例)。

@Configuration
@PropertySource("classpath:application-module1.properties")
public class MyPropertyConfig {}

要使此方法了解多个配置文件,您可以通过以下方式使用它

@Configuration
public class MyPropertyConfig {@Configuration@PropertySource("classpath:application-module1.properties")@Profile("default")static class DefaultConfig {}@Configuration@PropertySource("classpath:application-module1-production.properties")@Profile("production")static class ProductionConfig {}
}

好处是,您不必在主应用程序中为每个模块使用专用的配置文件,而是可以依靠简单的配置文件。 另外,它在配置类本身中表示,这可以很容易地检查哪些配置文件可用。

缺点是,这种方法仅适用于预定义的配置文件集,但是要添加新的配置文件时,必须记住必须将其也添加到MyPropertyConfig类中。 此外,当您更改模块名称时,不仅必须更改文件名,还必须更改代码中的引用。

向属性源添加新的属性文件模式

这种方法是最通用的一种,因为它将直接将新的属性文件模式注入到上下文中,并使其自动识别配置文件。 要使其正常工作,您必须通过ApplicationListener接口使用扩展机制。

这使您可以直接侦听ApplicationEnvironmentPreparedEvent事件,该事件在准备好运行时环境之后但在加载之前触发。 例如,它使您可以将文件添加到属性源。 该事件提供对ConfigurableEnvironment的访问,该环境可提供有关活动配置文件的信息。

如果侦听器将首先添加特定于配置文件的属性文件,然后将默认属性文件添加到ConfigurableEnvironment ,则这是示例实现。

public class PropertyFilePatternRegisteringListener implements ApplicationListener {public static final String PROPERTY_FILE_PREFIX = &quot;application-module3&quot;;private static final String FILE_SUFFIX = &quot;.properties&quot;;@Overridepublic void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {ConfigurableEnvironment environment = event.getEnvironment();try {loadProfileProperties(environment);loadPlainProperties(environment);} catch (IOException ex) {throw new IllegalStateException(&quot;Unable to load configuration files&quot;, ex);}}private void loadProfileProperties(ConfigurableEnvironment environment) throws IOException {String[] activeProfiles = environment.getActiveProfiles();if(activeProfiles != null && activeProfiles.length > 0)loadProfileProperties(environment, activeProfiles);elseloadProfileProperties(environment, environment.getDefaultProfiles());}private void loadProfileProperties(ConfigurableEnvironment environment, String[] profiles) throws IOException {for (String activeProfile : profiles) {addFileToEnvironment(environment, PROPERTY_FILE_PREFIX + &quot;-&quot; + activeProfile + FILE_SUFFIX);}}private void loadPlainProperties(ConfigurableEnvironment environment) throws IOException {addFileToEnvironment(environment, PROPERTY_FILE_PREFIX + FILE_SUFFIX);}private void addFileToEnvironment(ConfigurableEnvironment environment, String file) throws IOException {ClassPathResource classPathResource = new ClassPathResource(file);if (classPathResource.exists()) {environment.getPropertySources().addLast(new ResourcePropertySource(classPathResource));}}
}

要激活它,您必须在加载应用程序上下文时将其添加为ApplicationListener,如下所示

new SpringApplicationBuilder().listeners(new PropertyFilePatternRegisteringListener()).main(Application.class).registerShutdownHook(true).run(args);}

此变体的好处是,我们与活动配置文件无关,并且可以轻松添加特定于配置文件的新属性文件。 它还在启动过程的早期就启动了,以便应用程序从一开始就意识到此处指定的属性。

缺点是,必须将侦听器添加到每个子模块的主模块中。 而且在测试中使用其他/不同的属性文件(或至少是默认变体)并不是直接的。 在撰写本文时,我仅知道在集成测试中使用@PropertySource可以使其工作。 同样,让它知道默认Spring loader支持的所有情况比上述方法更为复杂。

摘要

在本文中,我们讨论了将新属性文件添加到Spring Boot应用程序的几种方法。 所有变体都有优点和缺点。

根据使用情况,我可以选择@PropertySource或使用ApplicationListener接口。 如果您只想拥有一组通用的属性,可以为特定的配置文件或主要模块的属性覆盖,那么前者就足够了。 当您绝对需要这种灵活性时,应该使用后一种方法。

翻译自: https://www.javacodegeeks.com/2016/11/spring-boot-multi-module-projects-adding-module-specific-property-files.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351621.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

修改hostname有几种方式?

1&#xff1a; hostname DB-Server --运行后立即生效&#xff08;新会话生效&#xff09;&#xff0c;但是在系统重启后会丢失所做的修改 2&#xff1a; echo DB-Server > /proc/sys/kernel/hostname --运行后立即生效&#xff08…

Java高阶语法---final

背景&#xff1a;听说final Java高阶语法是挺进BAT必经之路。 final: final关键字顾名思义就是最终不可改变的。 1、含义&#xff1a;final可以声明成员变量、方法、类和本地变量&#xff1b;一旦将引用声明为final&#xff0c;此引用将不再被改变&#xff0c;编译器会检查代码…

mysql 以 db 结尾_MySQL的高级部分

1. MySQL的事务(1)存储引擎的介绍介绍&#xff1a;当客户端发送一条SQL语句给服务器时&#xff0c;服务器端通过缓存、语法检查、校验通过之后&#xff0c;然后会通过调用底层的一些软件组织&#xff0c;去从数据库中查询数据&#xff0c;然后将查询到的结果集返回给客户端&…

VisualBasic 版 (精华区)

发信人: zkboy (小小鸟), 信区: VisualBasic 标 题: Re: 请教&#xff1a;如何在VB中实现16进制数或10进制数与2进制&#xfffd;发信站: BBS 水木清华站 (Thu Jun 15 19:39:37 2000)转一篇相关资料在编程中&#xff0c;我们经常使用二进制(binary)、八进制(octal)、十进…

Vim求生

[TOC] Vim 是从 vi 发展出来的一个文本编辑器。其代码补完、编译及错误跳转等方便编程的功能特别丰富&#xff0c;在程序员中被广泛使用。和 Emacs 并列成为类 Unix 系统用户最喜欢的编辑器。 —— 维基百科 很多接触 Vim 的程序员应该都有过这样的经历&#xff1a; 受某大 V 的…

activemq 内存_ActiveMQ:了解内存使用情况

activemq 内存正如最近的一些邮件列表电子邮件和Google返回的许多信息所表明的那样&#xff0c;ActiveMQ的SystemUsage尤其是MemoryUsage功能使一些人感到困惑。 我将尝试解释有关MemoryUsage的一些细节&#xff0c;这些细节可能有助于理解它的工作方式。 我将不介绍StoreUsage…

osg动态加载模型不显示_OSG仿真案例(8)——读取FBX格式文件并显示(无动画)...

包含的头#include #include #include #include #include #include #include #include #include using namespace std;所需要的类(结构体)struct AnimationManagerFinder : public osg::NodeVisitor{osg::ref_ptr<:basicanimationmanager> _am;AnimationManagerFinder(){o…

用微服务和容器替换旧版Java EE应用程序服务器

Lightbend最近对2000多个JVM开发人员进行了调查&#xff0c;结果刚刚发布。 开展该调查的目的是发现&#xff1a;发展趋势与IT基础设施趋势之间的相关性&#xff0c;处于数字化转型前沿的组织如何使他们的应用程序现代化以及当今对新兴开发人员技术最为关注的实际生产使用情况细…

点分治经典_动态点分治

HYSBZ_3730_震波 背景&#xff1a;这是接触的动态点分治第一题&#xff0c;开始不是很理解&#xff0c;看了很久&#xff0c;写了很久才理解了动态的动态所在。前置知识&#xff1a;静态点分治&#xff08;主要是容斥思想&#xff0c;一般看出来是点分治的话&#xff0c;想到怎…

python settings模块导入不了_无法导入设置“myproject.settings”(是否在sys.path上?):没有名为pinax的模块...

我正试图让皮纳克斯在网络派系工作&#xff0c;有这么多的问题。。。[Sun Feb 19 20:01:20 2012] [error] [client 127.0.0.1] mod_wsgi (pid22796): Exception occurred processing WSGI script /home/pawesome/webapps/qtsocial/myproject.wsgi.[Sun Feb 19 20:01:20 2012] […

VS2012 颜色配置成黑色

效果展示&#xff1a; 步骤&#xff1a; 1、工具->选项->环境->常规->颜色体验 选为深色 2、在http://studiostyl.es/schemes/son-of-obsidian中&#xff0c;下载Son of Obsidian字体设置&#xff0c;然后 工具->导入和导出设置->导入选定的环境设置->…

@bzoj - 2388@ 旅行规划

目录 descriptionsolutionaccepted codedetailsdescription 请你维护一个序列&#xff0c;支持两种操作&#xff1a; &#xff08;1&#xff09;某个区间 [x, y] 内的数同时加上一个增量 k。 &#xff08;2&#xff09;询问某一个区间 [x, y] 中从 1 开始的最大前缀和。 input …

java与java ee_Java EE 7社区调查结果!

java与java ee在JSR 342下可以继续进行Java EE 7的工作。一切都在顺利进行&#xff0c;Java EE 7现在处于早期草稿审查阶段。 在11月初&#xff0c; Oracle发布了一个有关即将推出的Java EE 7功能的小型社区调查 。 昨天结果公布了。 超过1,100名开发人员参加了调查&#xff0…

浅谈C++中内存分配、函数调用和返回值问题

在谈述函数调用和返回值问题之前&#xff0c;先来看看C中内存分配的问题。 C编译器将计算机内存分为代码区和数据区&#xff0c;很显然&#xff0c;代码区就是存放程序代码&#xff0c;而数据区则是存放程序编译和执行过程出现的变量和常量。数据区又分为静态数据区、动态数据区…

dataguard从库数据库丢失恢复例子(模拟所有的控制文件)

1.退出日志应用模式[oraclelocalhost ~]$ sqlplus /nolog SQL*Plus: Release 11.2.0.4.0 Production on Mon Jan 14 16:09:16 2019 Copyright (c) 1982, 2013, Oracle. All rights reserved. SQL> connect / as sysdbaConnected.SQL> alter database recover managed sta…

python教程自带数据库_python教程自带数据库 | Python学哪个数据库

python使用数据库增条数据import pymysql#返回Connection#host"localhost"con pymysql.connect(host"192.168.31.28",port3306,user"atguigu",password"atguigu",db"atguigudb",charset"utf8")#返回cursor对象cu…

Java SE 8新功能介绍:使用新的DateTime API计算时间跨度

使用Java SE 8新的DateTime API JSR 310…可以实现更清晰&#xff0c;可读且功能强大的编码。 Java SE 8&#xff0c;JSR 310 在上一篇文章“ 使用Streams API处理集合 ”中&#xff1b; 我已深入探讨和探索如何使用流遍历集合&#xff0c;如何从集合和数组创建流以及最终汇总…

使用VS2012内建的C++测试架构进行单元测试

前言 在软件开发的过程中&#xff0c;单元测试(Unit testing)是一个重要的coding步骤&#xff0c;可以让你的程序代码质量大幅提升、协助你进行良好的程序架构设计&#xff0c;单元测试是针对程序单元(软件设计的最小单位)来进行正确性检验的测试工作&#xff0c;在程序化编程中…

【博 客 文 章】

1、C#中的Explicit和Implicit转载于:https://www.cnblogs.com/kikyoqiang/p/10270416.html

sql intersect mysql_SQL INTERSECT子句

SQL INTERSECT子句/操作符用于合并两个SELECT语句&#xff0c;但只从第一个SELECT语句返回完全相同于第二个SELECT语句结果的所有行。这意味着INTERSECT是由两个SELECT语句返回相同的行(唯一)。正如使用UNION操作&#xff0c;同样的规则可使用在INTERSECT运算符。 但MySQL不支持…