使用Spring AOP进行切面编程时,可以通过JoinPoint(环绕增强通过ProceedingJoinPoint)获取参数和方法签名等。但也可以通过Spring的自动注入来获得参数,但有几点需要注意:
- 定义Pointcut时需要使用execution() && args()的方式
- Pointcut注解修饰的方法要带参数
- 增强处理注解设置pointcut时要有参数名,另外也要设置argNames
代码如下:
@Aspect
@Component
public class MyControllerAspect {
private static final Logger logger = LoggerFactory.getLogger(MyControllerAspect.class);
@Pointcut("execution(public * com.kaikai.controller.*.*(..))")
public void pointCut() {
}
@Pointcut(value = "execution(public * com.kaikai.controller.*.*(javax.servlet.http.HttpServletRequest, ..)) && args(request, ..)")
public void pointCut2(HttpServletRequest request) {
}
@Before("pointCut()")
public void doSthBefore(JoinPoint jp) {
logger.info("before: " + jp.getSignature().getName());
}
@Before(value = "pointCut2(request)", argNames = "request")
public void doSthBefore2 (JoinPoint jp, HttpServletRequest request) {
logger.info("before2: " + jp.getSignature().getName());
}
@Before(value = "execution(public * com.kaikai.controller.*.*(javax.servlet.http.HttpServletRequest, ..)) && args(request, ..)")
public void doSthBefore3 (JoinPoint jp, HttpServletRequest request) {
logger.info("before3: " + request);
}
}
PS:
- 注意第三个增强,如果直接写切入点表达式,而不是调用pointcut,就不用设置argNames
- JoinPoint要放在首个参数,不然也可能有异常。