首页 > 解决方案 > Spring Data JPA:将@EnableJpaRepositories basePackages 配置外部化到属性文件

问题描述

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

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

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

项目配置类

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

配置属性

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

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

谢谢!

标签: javaspringspring-dataspring-data-jpaspring-repositories

解决方案


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

使用 Spring Boot

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

@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 为注解类的包,因此您也可以将这些@Configurationbean 放入com.project.ph.daosample.project.jpa.repositories包中,并basePackages从注解中删除声明。您仍然需要其余的注释,但它是一个较少硬编码的值来管理。

参考


推荐阅读