我们在多模块项目中使用spring boot。
我们有一个域访问模块,它具有公共域对象类,存储库以及数据源,JPA,Hibernate等的配置。这些是使用application.properties配置的。我们将所有这些配置放入通用模块中,以便在更高级别的模块中保存重复这些常见配置。
这在构建域模块时工作正常,因此配置在测试单元中正确加载。
然而,当我们尝试在更高层模块中使用域模块时,问题就开始了;他们有自己的application.properties,这意味着Spring加载它们而不是Domain模块application.properties,这意味着没有配置数据源,因为只加载了更高模块的application.properties。
我们想要的是Spring加载的域模块和更高级别的应用程序属性。但我们无法轻易做到这一点。
我认为这一定是一个常见问题,并想知道是否有针对此问题的推荐解决方案?
由于我们使用spring-boot,理想情况下解决方案应使用注释而不是applictionContext.xml。
答案 0 :(得分:7)
也许您应该只在顶级聚合器项目中使用application.properties
?
您始终可以在子项目中使用@PropertySource
来使用特定于其用例的名称对其进行配置。
或者您可以为每个项目使用不同的名称,并使用spring.config.location
(逗号分隔)在顶级项目中将它们粘合在一起。
答案 1 :(得分:6)
我同意@Dave Syer。将应用程序拆分为多个模块的想法是每个模块都是一个独立的单元,在本例中是一个jar文件。从理论上讲,您可以将每个jar文件拆分为自己的源存储库,然后在多个项目中使用它们。假设您希望在Web和批处理应用程序中重用这些域类,如果所有APPLICATION级别配置都存储在每个单独的模块中,则会严重降低其可重用性。
IMO只有聚合模块应包含作为应用程序运行所需的所有配置,其他所有内容都只是一个可以根据需要重新混合和重用的依赖项。
答案 2 :(得分:4)
也许另一种方法可能是为每个模块定义特定的配置文件,并使用application.properties文件来指定女性配置文件处于活动状态 使用spring.profiles.include属性。
domain-module
- application.properties
- application-domain.properties
app-module
- application.properties
- application-app.properties
并进入app-module
的application.properties文件spring.profiles.include=domain,app
答案 3 :(得分:2)
您可以做的另一件事(除了在Dave Syer提到的顶层使用application.properties之外)就是将域模块的属性文件命名为domainConfig.properties
。
这样可以避免名称与application.properties
冲突。
domainConfig.properties
将包含域模块能够在其上进行测试所需的所有数据。可以使用多个@PropertySource
(一个用于domainConfig.properties
和一个用于application.properties
)或在Java Config中配置PropertySourcesPlaceholderConfigurer
bean轻松完成与其余代码的集成(查看this教程)引用所有需要的属性文件
答案 4 :(得分:0)
在 spring-boot 中,因为 2.4
支持 spring.config.import
例如
application.name=myapp
spring.config.import=developer.properties
# import from other module
spring.config.import=classpath:application-common.properties
或使用 spring.config.activate.on-profile
spring.config.activate.on-profile=prod
spring.config.import=prod.properties
参考:https://spring.io/blog/2020/08/14/config-file-processing-in-spring-boot-2-4