spring boot中使用aop

1、在pom文件中添加aop的依赖


spring boot中使用aop_第1张图片

2、使用示例参考如下

/**

*@authorfangzy

*@since2017/8/14.

*类级注解:

*@Aspect声明这是一个切面对象

*方法级注解:

*@Pointcut声明一个切点规则

*@Before方法执行之前,执行通知。

*@After方法执行之后,不考虑其结果,执行通知。

*@AfterReturning方法执行之后,只有在方法成功完成时,才能执行通知

*@AfterThrowing方法执行之后,只有在方法退出抛出异常时,才能执行通知

*@Around在方法调用之前和之后,执行通知 等价于上面四个相加

*/

@Component

@Aspect

public classMyAdvice {

Loggerlogger= LoggerFactory.getLogger(MyAdvice.class);

// expression配置切点的表达式,切到哪

@Pointcut("execution(* com.example.springboot.*Service.*(..))")

private voidbusinessService() {

}

//在一个方法执行之前,执行通知。

@Before("businessService()")

public voiddoBeforeTask(JoinPoint joinPoint) {

logger.info("doBeforeTask.");

ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();

HttpServletRequest request = requestAttributes.getRequest();

logger.info("请求的ip:{}",request.getRemoteAddr());

logger.info("请求的uri:{}",request.getRequestURI());

logger.info("请求的method:{}",request.getMethod());

logger.info("请求的类方法:{}.{}",joinPoint.getSignature().getDeclaringTypeName(),joinPoint.getSignature().getName());

logger.info("请求参数{}",joinPoint.getArgs());

}

//在一个方法执行之后,不考虑其结果,执行通知。

@After("businessService()")

public voiddoAfterTask() {

logger.info("doAfterTask.");

}

//在一个方法执行之后,只有在方法成功完成时,才能执行通知。

@AfterReturning(pointcut="businessService()",returning="retVal")

public voiddoAfterReturnningTask(JoinPoint joinPoint,Object retVal) {

String methodName = joinPoint.getSignature().getName();

logger.info("doAfterReturnningTask {} return with {}",methodName,retVal);

}

//在一个方法执行之后,只有在方法退出抛出异常时,才能执行通知

@AfterThrowing(pointcut="businessService()",throwing="ex")

public voiddoAfterThrowingTask(JoinPoint joinPoint,Exception ex) {

String methodName = joinPoint.getSignature().getName();

logger.info("doAfterThrowingTask {} occurs exception: {} ",methodName,ex);

}

//在建议方法调用之前和之后,执行通知。

@Around("businessService()")

publicObjectdoAroundTask(ProceedingJoinPoint jpoint) {

Object result =null;

String methodName = jpoint.getSignature().getName();

//执行目标方法

try{

//前置通知

logger.info("The method {} begins with {}",methodName,Arrays.asList(jpoint.getArgs()));

result = jpoint.proceed();

//返回通知

logger.info("The method {} ends with {} ",methodName,Arrays.asList(jpoint.getArgs()));

}catch(Throwable e) {

//异常通知

logger.info("The method {} occurs expection {} ",methodName,e);

throw newRuntimeException(e);

}

//后置通知

logger.info("The method {} ends",methodName);

returnresult;

}

}

你可能感兴趣的:(spring boot中使用aop)