java - Spring 数据JPA : externalize to a property file the @EnableJpaRepositories basePackages configuration

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

我想外部化 @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.daosample.project.jpa.repositories 包并从注释中删除 basePackages 声明。您仍然需要其余的注释,但它是一个较少需要管理的硬编码值。

引用文献

关于java - Spring 数据JPA : externalize to a property file the @EnableJpaRepositories basePackages configuration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50356299/

相关文章:

java - 多个 Super( ) 用于重载父类(super class)构造函数

sql - MyBatis RowBounds 不限制查询结果

elasticsearch - Spring Data Elasticsearch 中的滚动索引(动态索引名称)

maven - wordCount作业在 Spring 批处理中失败

java - 使用Spring异步执行时实体未持久化到数据库

java - Spring Batch Reader 的游标在 JTA 事务管理步骤中提前关闭

java - 如何关闭 Spring Boot 命令行应用程序

spring - Postgres JDBC 数据源实例

java - 在测试用例中定义 spring active profile

java - 如何在android项目中包含sqlite4java