java - 如何使用周围方面包装所有存储库调用

标签 java spring-data aop spring-aop

我想将所有存储库调用包装在我的服务中,并使用 around 方面来创建一些指标。

我所有的JpaRepositories都用org.springframework.stereotype.Repository注释,所以我尝试了这样的事情:

@Configuration
@Aspect
public class RepositoryMetrics {

    @Around("@annotation(org.springframework.stereotype.Repository)")
    public void logQueryTime(ProceedingJoinPoint joinPoint) throws Throwable {
        //Some logic here
        joinPoint.proceed();
        //Some logic here
    }
}

但似乎方面方法从未运行。我错过了什么?

最佳答案

假设您的 JpaRepository 类注释如下

@Repository
public interface JpaEmployeeRepository extends CrudRepository<JpaEmployee, Long> {
...
}

以下方面将拦截该类发生的所有方法调用

@Component
@Aspect
public class RepositoryAspect {

    @Pointcut("@within(org.springframework.stereotype.Repository)")
    public void repositoryAnnotationPointCut() {}

    @Around("repositoryAnnotationPointCut()")
    public void logQueryTime(ProceedingJoinPoint pjp) throws Throwable {

        System.out.println("logged for "+pjp.toLongString());
        pjp.proceed();
    }
}

请注意,配置类最好留给配置条目,您可以为 Aspect 创建一个单独的类,并使用示例中给出的 @Component 对其进行注释。

确保您有@ComponentScan来自动检测配置类上的Aspect和@EnableAspectJAutoProxy。内容如下

@Configuration
@EnableAspectJAutoProxy
@ComponentScan(basePackageClasses= {RepositoryAspect.class})
public class AppConfig {
...
}

更新

以下是您的代码未按预期工作的原因

1.

Pointcut designator @注释

@annotation: Limits matching to join points where the subject of the join point (the method being executed in Spring AOP) has the given annotation.

在这种情况下,方法没有被注释。

2.

配置类RepositoryMetrics未使用@EnableAspectJAutoProxy进行注释。我假设 Spring AOP 没有在任何配置类中启用。

关于java - 如何使用周围方面包装所有存储库调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59635221/

相关文章:

java - 按钮单击 JSF 2.2 时 bean 中的实例变量增量

java - 生产者无法将消息分发给多个消费者?

java - spring-projects/spring-data-commons 中的 PageableHandlerMethodArgumentResolver

java - 支持 JSP 的最小 Java Web 服务器

java - JDBC Select * from user_table 抛出错误

java - @Transactional 在未提交的事务上采用旧值

java - application.properties 中 spring.jpa.hibernate.ddl-auto=update 的问题

java - 看点在多个类中创建内部类型方法

java - @DeclareParents 未能引入新方法

c# - 如何处理 ASP.NET MVC 3 应用程序中的横切关注点?