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

时间:2018-05-15 17:40:18

标签: java spring spring-data spring-data-jpa spring-repositories

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

我有两个不同的样本包

  • com.project.ph.dao
  • sample.project.jpa.repositories

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

ProjectConfig.class

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

config.properties

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

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

谢谢!

1 个答案:

答案 0 :(得分:0)

不,您无法在@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 bean放入com.project.ph.daosample.project.jpa.repositories包并从注释中删除basePackages声明。您仍然需要其余的注释,但它需要管理的硬编码值较少。

参考