Spring Data JPA:将@EnableJpaRepositories basePackages 配置外部化到属性 文件

Spring Data JPA : externalize to a property file the @EnableJpaRepositories basePackages configuration

我想外部化 @EnableJPARepositories basePackages 的配置。

下面有两个不同的示例包

我在下面尝试了 属性 外部化(不适用于多个包)

ProjectConfig.class

@EnableJpaRepositories(basePackages = {"${basePackages}"})

config.properties

basePackages=com.project.ph.dao,sample.project.jpa.repositories

是否有任何其他方法可以将此配置外部化为多个包?

谢谢!

不,您不能在 @EnableJpaRepositories 注释中使用 SPEL。原因是注释可能存在于配置 bean 上,并定义了额外的 属性 源,这些源可以覆盖注释中使用的属性,因此您将有一个鸡和蛋的场景来尝试加载 bean。但是您仍然可以使用 Spring 的配置机制来解决您的问题。

带Spring开机

与其在单个 class 中声明所有包,不如使用 Spring 中的 @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开机

这很相似,除了不使用 @ConditionalOnProperty,您只需使用 @Conditional. This requires you to implement a Condition class 来检查属性。

补充说明

当使用@EnableJpaRepositories注解时,默认basePackageswill be the package of the annotated class,所以你也可以把这些@Configuration bean放到com.project.ph.daosample.project.jpa.repositories 包并从注释中删除 basePackages 声明。您仍然需要其余的注释,但管理的硬编码值少了一个。

参考资料