如何设置Spring Data JPA存储库而不进行组件扫描

11
为了提高性能,我将从组件扫描切换到显式声明我的bean。所以基本上我想要删除@EnableJpaRepositories,因为它会扫描存储库。
我的存储库是标准接口,扩展了JpaRepository。我该如何声明我的存储库?
3个回答

16

您可以通过手动声明 JpaRepositoryFactoryBean 来创建单独的存储库实例:

@Configuration
class Config {

  @Bean
  public JpaRepositoryFactoryBean userRepository() {
    JpaRepositoryFactoryBean factory = new JpaRepositoryFactoryBean();
    factory.setRepositoryInterface(UserRepository.class);
    return factory;
  }
}

这将导致Spring调用getObject()从工厂中获取存储库代理,并可能将其注入客户端。

然而,我认为,除非明显配置错误,否则扫描存储库的开销可以忽略不计,特别是与初始化EntityManagerFactory所需的时间相比。


1
组件扫描在某些云运行时(即 Google App Engine)中可能会导致性能问题,其中应用程序实例需要“热身”(基本上是完全重新部署)一段时间后。你的解决方案可能比你想象的更有用,谢谢! - Michael Técourt
@Oliver Gierke,这一切都很好,但有一个小问题。由于我的应用程序是多租户的,所以我不能像上面那样创建JpaRepositoryFactoryBean。有没有一种懒加载的方法来创建它?另外,JpaRepositoryFactoryBean附加在userRepository上,如何为此创建多个工厂bean? - Mohammad Adnan
你必须为每个仓库创建一个工厂bean吗? - gagarwa
@oliver-drotbohm 如果我在AutoConfiguration项目中这样做,到了2022年快进,我的客户端应用程序中的其他存储库将为空:/ - silentsudo

6

我同意@Oliver所说的。不过,随着时间的推移,Spring Data JPA的API显然已经发生了变化,在当前版本(2.2.3)中,代码段应该如下所示:

@Configuration
class Config {

  @Bean
  // assuming userId is String
  public JpaRepositoryFactoryBean<UserRepository, User, String> userRepository() {
    JpaRepositoryFactoryBean factory = new JpaRepositoryFactoryBean(UserRepository.class);
    return factory;
  }
}

3
如果您只想配置一个具体的存储库bean,可以直接使用工厂来创建它,如下所示:
@Configuration
public class NotificationConfig {

    @Bean
    public NotificationRepository notificationRepository(EntityManager entityManager) {
        JpaRepositoryFactory jpaRepositoryFactory=new JpaRepositoryFactory(entityManager);
        return jpaRepositoryFactory.getRepository(NotificationRepository.class);
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接