Выражение pointcut
@Around("execution(* com.blog.controllers.PostController.add(..)) && args(request,..)")
можно объяснить как совет для точки соединения (выполнение метода в случае Spring AOP), которая соответствует следующему условию
выполнение метода com.blog.controllers.PostController.add
любого возвращаемого типа (*) и любых аргументов (..)
и
, этот метод должен иметь HttpServletRequest request
в качестве первого аргумента
Теперь в вашем PostController
метод add(ModelMap model,Article article,HttpSession session)
не будет соответствовать выражению pointcut
Выражение pointcut сработает, если вы удалите args(request,..)
и вы сможете получить доступ к HttpServletRequest следующим образом
@Around("execution(* com.blog.controllers.PostController.add(..)) && within(com.blog.controllers..*)")
public String authorized(ProceedingJoinPoint jp) throws Throwable {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
.getRequest();
return (String) jp.proceed();
}
within()
is Обозначение области видимости, позволяющее сузить область действия классов до совета.
Примечание:
Когда вы аннотируете класс Aspect
с помощью @Component
, он будет автоматически определен @ComponentScan(basePackages = { "com.blog" })
, если PostAop
находится на любом уровне в пакете root com.blog
. Это означает, что вам не нужно создавать компонент с использованием фабричного метода и аннотации @Bean
. Требуется либо @Component
, либо @Bean
.
В соответствии с java соглашением об именах имя метода будет authroized()
, а не Authorized()
Надеюсь, это поможет.