Spring AOP的快速使用
2020-09-02 本文已影响0人
Rogue_bbb1
开启AspectJ支持
首先需要开启AspectJ的支持,使用@EnableAspectJAutoProxy注解
@Configuration
@EnableAspectJAutoProxy
public class AspectJConfig {
}
@Configuration是将类标记为配置类
定义Aspect
Aspect可以作为一个AOP逻辑的单元,里面可以定义切点和切面
@Component
@Aspect
public class ControllerLogAspect {
}
没有@Component会导致类没有被Spring加载从而导致定义的AOP方法没有被执行
定义Pointcut
@Component
@Aspect
public class ControllerLogAspect {
@Pointcut("within(com.zww.demo.controller..*)")
public void inController() {
}
}
pointcut用来定义advice被执行的节点,需要注意pointcut定义的方法返回值必须为void.
pointcut使用的语法是aspectj 5 pointcut language
spring支持以下几种pointcut:
- execution
- within
- this
- target
- args
- @target
- @args
- @within
- @annotation
pointcut的组合
@Pointcut("execution(public * *(..))")
private void anyPublicOperation() {}
@Pointcut("within(com.xyz.myapp.trading..*)")
private void inTrading() {}
@Pointcut("anyPublicOperation() && inTrading()")
private void tradingOperation() {}
第三个方法表示同时满足1,2两个条件
定义Advice
@Component
@Aspect
public class ControllerLogAspect {
@Before("inController()")
public void before(JoinPoint joinPoint){
log.info(Arrays.toString(joinPoint.getArgs()));
}
@Around("inController()")
public Object controllerAroundLog(ProceedingJoinPoint joinPoint) throws Throwable {
String className = joinPoint.getTarget().getClass().getName();
String functionName = joinPoint.getSignature().getName();
Object[] args = joinPoint.getArgs();
log.info("function:{}===>{},\nargs:{}", className, functionName, args);
Object proceed = joinPoint.proceed();
log.info("function:{}===>{},\nresponse:{}", className, functionName, proceed);
return proceed;
}
}
所有的advice方法可以使用一个JoinPoint 参数作为方法的第一个参数,这个参数会包含一些被执行方法的信息,@Around类型的advice使用的是ProceedingJoinPoint,继承自JoinPoint .
JoinPoint 的API
示例
@Component
@Aspect
public class ControllerLogAspect {
@Pointcut("within(com.zww.demo.controller..*)")
public void inController() {
}
@Before("inController()")
public void before(JoinPoint joinPoint){
log.info(Arrays.toString(joinPoint.getArgs()));
}
@Around("inController()")
public Object controllerAroundLog(ProceedingJoinPoint joinPoint) throws Throwable {
String className = joinPoint.getTarget().getClass().getName();
String functionName = joinPoint.getSignature().getName();
Object[] args = joinPoint.getArgs();
log.info("function:{}===>{},\nargs:{}", className, functionName, args);
Object proceed = joinPoint.proceed();
log.info("function:{}===>{},\nresponse:{}", className, functionName, proceed);
return proceed;
}
}