Почему Pointcut Spring-AOP работает для сохранения (..), но не для saveAll (..) - PullRequest
1 голос
/ 11 июля 2020

У меня есть репозиторий 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 all и crud save all

Я ожидал, что saveAll перехватит только FooRepository, поскольку Я напрямую сокращаю package.class.method. Кажется, это сработало для save, но не для saveAll.

Это потому, что аргументы в saveAll равны Iterable? Или здесь происходит какое-то стирание типов с дженериками? Что-нибудь еще?

1 Ответ

2 голосов
/ 12 июля 2020

Похоже, проблема с АОП. Для прокси FooRepository.saveAll он вызывает CrudRepository.saveAll @Before выражение:

AbstractAspectJAdvice 683 AOP pointcut

...