javascript
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 = "application-module3";private static final String FILE_SUFFIX = ".properties";@Overridepublic void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {ConfigurableEnvironment environment = event.getEnvironment();try {loadProfileProperties(environment);loadPlainProperties(environment);} catch (IOException ex) {throw new IllegalStateException("Unable to load configuration files", 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 + "-" + 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
總結
以上是生活随笔為你收集整理的Spring Boot和多模块项目–添加模块特定的属性文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ibm aix_IBM AIX:Java
- 下一篇: 苹果怎么设置短信拦截功能