Сегодня я пытаюсь управлять некоторыми файлами AOP с помощью Spring 4, и у меня проблема с @Around аннотацией. Он работает только после pointcut и ведет себя как @ После аннотации. Что еще хуже - комбинация @Before и @Around эффекты аннотации только при вызове метода после pointcut.AOP, Spring 4 MVC и @Around аннотация
Комбинация @After и @Before работает нормально. Честно говоря, я понятия не имею, почему это так.
Я также пытаюсь использовать mockito для обнаружения вызова метода АОП, но он не работает.
У меня есть класс конфигурации
@Configuration
@EnableAspectJAutoProxy
@ComponentScan(basePackages = { "my.package.to.aop" })
public class AOPConfiguration {}
АОП класс:
@Aspect
@Component
public class SmartLoggerAspect {
@After("execution(* my.package.to.specific.function."
+ "repositories.PagingAndSortingBookRepository.findAll("
+ "org.springframework.data.domain.Pageable) )")
public void afterPage(JoinPoint joinPoint){
System.out.println("\n\n\n\nCALLED AFTER: " + joinPoint.getSignature().getName());
}
@Before("execution(* my.package.to.specific.function."
+ "repositories.PagingAndSortingBookRepository.findAll("
+ "org.springframework.data.domain.Pageable) )")
public void beforePage(JoinPoint joinPoint){
System.out.println("\n\n\n\nCALLED BEFORE: " + joinPoint.getSignature().getName());
}
@Around("execution(* my.package.to.specific.function."
+ "repositories.PagingAndSortingBookRepository.findAll("
+ "org.springframework.data.domain.Pageable) )")
public void aroundPage(JoinPoint joinPoint){
System.out.println("\n\n\n\nCALLED AROUND: " + joinPoint.getSignature().getName());
}
}
И я сделал UnitTest для него
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = { JPAConfig.class, AOPConfiguration.class })
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, TransactionalTestExecutionListener.class })
public class AspectTest {
@Autowired
PagingAndSortingBookRepository pagingAndSortingRepo;
@Autowired
SmartLoggerAspect smartLoggerAspect;
JoinPoint joinPoint;
@Test
public void pagingTest(){
pagingAndSortingRepo.findAll(new PageRequest(1, 1));
//verify(smartLoggerAspect, times(1)).afterPage(joinPoint);
}
}
Для чего вам нужны '@ Before' +' @ After' __and__ '@ Around' советы? Почему бы вам не попробовать расчесывать советы в одном совете '@ Around'? –
Потому что я новичок и много способов использовать АОП. Когда я комментирую функцию aBefore и aAfter и оставляю aAround только, все равно у меня такая же проблема. –
Что вы имеете в виду под «Это работает только после pointcut [...]»? –