繁体   English   中英

为什么 Spring-AOP 切入点适用于 save(..) 而不是 saveAll(..)

[英]Why does Spring-AOP pointcut work for save(..) but not saveAll(..)

我有一个像这样的 Spring-Data 存储库:

package com.example.demo;

@RepositoryRestResource
public interface FooRepository extends JpaRepository<Foo, Long> {

    @Override
    <S extends Foo> S save(S entity);

    @Override
    <S extends Foo> List<S> saveAll(Iterable<S> entities);

}

像这样的一个方面:

@Aspect
@Component
public class FooAspect {

    @Before("execution(* org.springframework.data.repository.CrudRepository.save(*))")
    void crudSaveBefore(JoinPoint joinPoint) throws Throwable {
        System.out.println("crud save");
    }

    @Before("execution(* com.example.demo.FooRepository.save(*))")
    void fooSaveBefore(JoinPoint joinPoint) throws Throwable {
        System.out.println("foo save");
    }

    @Before("execution(* org.springframework.data.repository.CrudRepository.saveAll(*))")
    void crudSaveAll(JoinPoint joinPoint) throws Throwable {
        System.out.println("crud save all");
    }

    @Before("execution(* com.example.demo.FooRepository.saveAll(*))")
    void fooSaveAll(JoinPoint joinPoint) throws Throwable {
        System.out.println("foo save all");
    }

}

当我运行fooRepository.save(..)时,在控制台中我看到: foo save

当我运行fooRepository.saveAll(..)时,在控制台中我看到foo save allcrud save all

我期待saveAll只拦截FooRepository风格,因为我直接切入 package.class.method。 这似乎对save有效,但对saveAll无效。

这是因为saveAll中的参数是Iterable吗? 或者 generics 发生了某种类型的擦除? 还有什么?

似乎是 AOP 问题。 对于代理FooRepository.saveAll它调用CrudRepository.saveAll @Before表达式:

AbstractAspectJAdvice 683 AOP 切入点

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM