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