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

cha*_*mae 2 java spring spring-data spring-data-jpa spring-repositories

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

我下面有两个不同的示例包

  • com.project.ph.dao
  • 示例.project.jpa.repositories

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

项目配置类

@EnableJpaRepositories(basePackages = {"${basePackages}"})
Run Code Online (Sandbox Code Playgroud)

配置属性

basePackages=com.project.ph.dao,sample.project.jpa.repositories
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Bri*_*ian 5

不,您不能在@EnableJpaRepositories注释中使用 SPEL。原因是注释可能存在于配置 bean 上,并且定义了其他属性源,这些属性源可能会覆盖注释中使用的属性,因此您会遇到尝试加载 bean 的先有鸡还是先有蛋的情况。但您仍然可以使用 Spring 的配置机制来解决您的问题。

带弹簧引导

不要在单个类中声明所有包,而是使用Spring Boot 中的注释创建两个或多个@Configuration基于属性启用的 bean ,例如:@ConditionalOnProperty

@Configuration
@EnableJpaRepositories(basePackages = "com.project.ph.dao")
@ConditionalOnProperty("com.project.ph.dao.enabled")
public class PhProjectRepostoriesConfiguration {
}
Run Code Online (Sandbox Code Playgroud)

然后是另一个:

@Configuration
@EnableJpaRepositories(basePackages = "sample.project.jpa.repositories")
@ConditionalOnProperty("sample.project.jpa.repositories.enabled")
public class SampleProjectRepostoriesConfiguration {
}
Run Code Online (Sandbox Code Playgroud)

然后在你的application.properties文件中:

sample.project.jpa.repositories.enabled=true
com.project.ph.dao.enabled=false
Run Code Online (Sandbox Code Playgroud)

没有 Spring Boot

这很相似,除了不使用@ConditionalOnProperty,您只需使用@Conditional. 这需要您实现一个Condition将检查属性的类。

补充笔记

使用@EnableJpaRepositories注解时,默认basePackages 是被注解类的包,所以你也可以将这些@Configurationbean放入com.project.ph.dao和包中,并从注解中sample.project.jpa.repositories删除声明。basePackages您仍然需要其余的注释,但它是一个较少需要管理的硬编码值。

参考