У меня есть репозиторий 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
? Или здесь происходит какое-то стирание типов с дженериками? Что-нибудь еще?