我想外部化 @EnableJPARepositories basePackages 的配置。
下面有两个不同的示例包
- com.project.ph.dao
- sample.project.jpa.repositories
我尝试了下面的属性外部化(不适用于多个包)
ProjectConfig.class
@EnableJpaRepositories(basePackages = {"${basePackages}"})
配置.属性
basePackages=com.project.ph.dao,sample.project.jpa.repositories
是否有其他方法可以为多个包外部化此配置?
谢谢!
最佳答案
不,您不能在 @EnableJpaRepositories
注释中使用 SPEL。原因是注释可能存在于配置 bean 上,并且定义了其他属性源,这些属性源可能会覆盖注释中使用的属性,因此您会遇到尝试加载 bean 的先有鸡还是先有蛋的情况。但您仍然可以使用 Spring 的配置机制来解决您的问题。
使用 Spring Boot
不要在单个类中声明所有包,而是创建两个或多个使用 Spring Boot 中的 @ConditionalOnProperty
注释基于属性启用的 @Configuration
bean,例如:
@Configuration
@EnableJpaRepositories(basePackages = "com.project.ph.dao")
@ConditionalOnProperty("com.project.ph.dao.enabled")
public class PhProjectRepostoriesConfiguration {
}
然后是另一个:
@Configuration
@EnableJpaRepositories(basePackages = "sample.project.jpa.repositories")
@ConditionalOnProperty("sample.project.jpa.repositories.enabled")
public class SampleProjectRepostoriesConfiguration {
}
然后在您的 application.properties
文件中:
sample.project.jpa.repositories.enabled=true
com.project.ph.dao.enabled=false
没有 Spring Boot
这很相似,除了不使用 @ConditionalOnProperty
,您只需使用 @Conditional
。这需要您实现一个 Condition
类来检查属性。
附加说明
当使用 @EnableJpaRepositories
注释时,默认的 basePackages
will be the package of the annotated class ,因此您也可以将这些 @Configuration
beans 放入 com.project.ph.dao
和 sample.project.jpa.repositories
包并从注释中删除 basePackages
声明。您仍然需要其余的注释,但它是一个较少需要管理的硬编码值。
引用文献
-
@ConditionalOnProperty
Javadoc (docs.spring.io) -
@Conditional
Javadoc (docs.spring.io) -
Condition
Javadoc (docs.spring.io) - Spring Auto-Configuration Documentation (docs.spring.io)
-
@EnableJpaRepositories
usage documentation (docs.spring.io) - Additional information when working with multiple
DataSource
objects (stackoverflow.com)
关于java - Spring 数据JPA : externalize to a property file the @EnableJpaRepositories basePackages configuration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50356299/