首页 > 解决方案 > 如何使用未添加到 Spring 上下文的 Spring 创建 JPA 实现?

问题描述

我想将使用 Spring 的缓存和注释添加到使用 Spring Data 的存储库中,但我不希望将缓存注释添加到扩​​展 JpaRepository 接口以分离关注点的同一接口。

我想围绕 Spring JPA 存储库创建一个包装器,定义如下:

@NoRepositoryBean
public interface MyRepository extends JpaRepository<MyEntity, Long>{
    MyEntity findOneByMyAttribute(String myAttribute);  
}

public interface MyRepositorySpring extends MyRepository {}

Spring 默认创建一个实现并将其添加到 beans 上下文中,即使没有@Repository注释存在。

我的问题是我想在上下文中完全控制 bean。我想创建一个这样的包装器:

public class MyCachedRepository extends MyRepository {
    private final MyRepository wrappedRepository;

    @Cacheable
    MyEntity findOneByMyAttribute(String myAttribute){
        wrappedRepository.get(myAttribute);
    }
}

Spring Data创建的实现在哪里wrappedRepository,然后创建配置如下:

@Configuration
public class MyConf {

    @Bean
    public MyRepository myRepository() {
        return new MyCachedRepository(myJpaRepository());
    }

    private MyRepository myJpaRepository() {
        //here I would have the code that generates the implementation 
    }
}

像这样,我总是可以让我的代码注入一个myRepositorybean,并让配置决定上下文中的 bean 是包装存储库还是 jpa 之一,因为始终只有一个。

有没有办法做到这一点?

标签: javaspringspring-data-jpaspring-cache

解决方案


推荐阅读