直接注入JpaRepository <User>

时间:2019-08-28 14:55:03

标签: java spring

我正在寻找一种方法来拦截去往所有定义方法的所有请求。

  

(定义为JpaRepository接口上的所有内容)。

例如,当有人调用repo.findAll()时,我将能够在此前后运行通用代码。

  

(所有实体的通用代码相同)。

所以我所做的就是在JpaRepository中创建了一个通用类并实现了方法,然后拦截了所有请求。

@Repository
public class BaseJpaRepository<T> implements JpaRepository<T, Long> {

    @Autowired
    private JpaRepository<T, Long> repository;

    @Override
    public List<T> findAll() {
        //run some code here
        List<T> res = repository.findAll();
        //run some code here
        return res;
    }
    // all other methods here...
}

这是注入服务的接口:

@Repository
public interface UserRepository extends JpaRepository<UserEntity, Long> {

}

这是豆子

@Repository
public class UserRepositoryBean extends  BaseJpaRepository<User> implements JpaRepository<User, Long> {

}

问题是private JpaRepository<T, Long> repository;没有注入,我认为这是因为spring需要在启动时使用Entity类型。

如果UserRepositoryBean,我也尝试将其显式类型注入构造函数并将其传递给父级。但不满意。

@Repository
public class UserRepositoryBean extends  BaseJpaRepository<User> implements JpaRepository<User, Long> {

public UserRepositoryBean(JpaRepositry<User, Long> repo){super(repo);}

}

有什么方法可以拦截所有Spring jpa方法?

谢谢

1 个答案:

答案 0 :(得分:1)

首先,您将定义所有自定义存储库都将继承的基本接口

@NoRepositoryBean
interface BaseJpaRepository<T, ID> extends JpaRepository<T, ID> {
     // You can also declare any generic methods here, 
     // and override (intercept) them in BaseJpaRepositoryImpl as well
}

它也是实现方式

@NoRepositoryBean
class BaseJpaRepositoryImpl<T, ID>
        extends SimpleJpaRepository<T, ID>
        implements BaseJpaRepository<T, ID> {

    public BaseJpaRepositoryImpl(JpaEntityInformation<T, ID> entityInformation, EntityManager em) {
        super(entityInformation, em);
    }

    // One of 'defined' methods inherited from SimpleJpaRepository (and in turn from JpaRepository)
    @Override
    public List<T> findAll() {
        //run some code here
        List<T> res = super.findAll();
        //run some code here
        return res;
    }

    // other 'defined' methods to intercept ...
}

您的自定义存储库看上去将与往常一样,只不过它现在是从您的BaseJpaRepository接口而不是Spring的JpaRepository

派生的。
@Repository
interface UserRepository extends BaseJpaRepository<User, Long> {
}

要使其全部正常工作,让我们修改通常放在某个@Configuration类或@SpringBootApplication版的类上的以下注释

@EnableJpaRepositories(
        basePackages = {"org.example.repositories"},
        repositoryBaseClass = BaseJpaRepositoryImpl.class
)

PS 。另一种可行的方法是使用Spring AOP。您也可以查看类似的问题here