1、添加aop的maven坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2、创建一个切面类,并添加注解(注意:不要创建Aspect的切面类(不然会不起作用),需要创建Class的切面类)
@Aspect
@Component
public class LogAspect {
private static Logger logger = LoggerFactory.getLogger(LogAspect.class);
}
3、配置切面类
@Aspect
@Component
public class LogAspect {
private static Logger logger = LoggerFactory.getLogger(LogAspect.class);
/***
* 切入点
*/
@Pointcut("execution(* com.security.securitydemo.controller..*.*(..))")
public void pointCut(){
}
/*****
* 前置通知
* @param joinPoint
*/
@Before("pointCut()")
public void beforeAdvice(JoinPoint joinPoint){
Signature signature = joinPoint.getSignature();
logger.info("前置通知,signature = {} ",signature);
Object[] args = joinPoint.getArgs();
logger.info("前置通知,args = {}",Arrays.toString(args));
}
/***
* 最终通知
*/
@After("pointCut()")
public void afterAdvice(){
logger.info("后置最终通知---------");
}
/*****
* 最终回调通知
* @param joinPoint
* @param keys
*/
@AfterReturning(value = "pointCut()",returning = "keys")
public void afterReturingAdvice(JoinPoint joinPoint,String keys){
logger.info("最终回调通知,keys = {}==================",keys);
}
/*****
* 最终异常通知
* @param joinPoint
* @param e
*/
@AfterThrowing(value = "pointCut()",throwing = "e")
public void afterThrowingAdvice(JoinPoint joinPoint,Exception e){
logger.info("最终异常通知,e = {}==================",e);
}
/*****
* 环绕通知
* @param proceedingJoinPoint
* @return
*/
@Around("pointCut()")
public Object aroundAdvice(ProceedingJoinPoint proceedingJoinPoint){
logger.info("环绕通知前",proceedingJoinPoint.getSignature().getName());
try {
Object proceed = proceedingJoinPoint.proceed();
logger.info("环绕通知后",proceedingJoinPoint.getSignature().getName());
return proceed;
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return null;
}
}
注意:项目的包结构也有可能会导致aop不起作用,需要看自己的包结构来决定是否需要指定 扫描哪些包