Spring Data JPA - 如何以编程方式设置JpaRepository基础包

mar*_*dus 7 java spring spring-data-jpa spring-java-config

在Spring Java Config类中定义EntityManager时,我可以通过调用相应构建器上的方法来添加基础包以扫描Entity类:

public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder) {
  // Some other configuration here
  builder.packages("org.foo.bar", "org.foo.baz");
  return builder.build();
}
Run Code Online (Sandbox Code Playgroud)

我需要一些类似于Spring寻找存储库接口的地方.通常的方法是使用@EnableJpaRepositories注释:

@EnableJpaRepositories(basePackages = {"org.foo.barbaz"})
Run Code Online (Sandbox Code Playgroud)

但我希望有一种动态的方式来定义这些包,类似于上面的Entity位置.像这样的东西:

public SomeJpaRepositoryFactoryBean entityManagerFactory(JpaRepositoryFactoryBuilder builder) {
  // Some other configuration here
  builder.packages("org.foo.barbaz");
  return builder.build();
}
Run Code Online (Sandbox Code Playgroud)

有没有办法用当前的Spring Data JPA版本来做到这一点,这是不是意味着这样做?

Mạn*_*yễn 10

您可以使用@AutoConfigurationPackage注释将子模块的包添加到scan-packages.

  1. @EnableJpaRepositories从您的子模块中删除所有内容
  2. @AutoConfigurationPackage类添加到子模块顶级目录(类似于@SpringBootApplication,您必须将此类放在最顶层的目录中以扫描所有子包):

    @AutoConfigurationPackage
    public class ChildConfiguration {
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 创建spring.factories下文件/resources/META-INF/spring.factories孩子模块并添加配置类:

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.child.package.ChildConfiguration

现在,您可以@Autowired从核心项目中获取存储库.(经过测试和工作)


Mar*_* K. 6

没有Spring Boot(普通的Spring MVC设置)

@EnableJpaRepositories可以在多个@Configuration班级上使用.也就是说,每个模块都可以通过拥有自己的配置类来声明自己的存储库:

@Configuration
@EnableJpaRepositories(basePackages = "package1")
public class ConfigClass1 { /* ... */ }

@Configuration
@EnableJpaRepositories(basePackages = "package2")
public class ConfigClass2 { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

Spring Data JPA然后计入所有这些(package1package2).

虽然这仍然不是一种程序化的方式,但它解决了我的问题.