注解实现AOP
2024-08-31 04:59:29
package com.dch.service.aop; import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date; import javax.servlet.http.HttpServletRequest; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; /**
* AOP Controller RestController
*
* @author liu wp
*
*/
@Aspect
@Component
public class AutoControllerAspect {
private static SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/** 日志类 */
private final Logger logger = LoggerFactory.getLogger(super.getClass()); /**
* AfterReturning 核心业务逻辑调用正常退出后,不管是否有返回值,正常退出后,均执行
*
* @param joinPoint
* @param returnObj
* 返回值
*/
@AfterReturning(pointcut = "allControllerMethod()||allrestControllerMethod()", returning = "returnObj")
public void afterReturning(final JoinPoint joinPoint, final Object returnObj) {
logger.info("----afterReturning Start 请求时间:{}----", dateTimeFormat.format(new Date()));
logger.info("返回值:{}", returnObj);
logger.info("----afterReturning End 请求时间:{}----", dateTimeFormat.format(new Date())); } /**
* AfterThrowing 核心业务逻辑调用异常退出后执行,处理错误信息
*
* @param joinPoint
* @param ex
* 异常信息
*/
@AfterThrowing(value = "allControllerMethod()||allrestControllerMethod()", throwing = "ex")
public void AfterThrowing(final JoinPoint joinPoint, final Exception ex) {
logger.info("----AfterThrowing Start 请求时间:{}---", dateTimeFormat.format(new Date()));
logger.info("异常信息:{}", ex.getMessage());
logger.info("----AfterThrowing End 请求时间:{}---", dateTimeFormat.format(new Date()));
} /**
* 监控所有@Controller的方法
*/
@Pointcut("within(@org.springframework.stereotype.Controller *)")
public void allControllerMethod() {
} @Pointcut("within(@org.springframework.web.bind.annotation.RestController *)")
public void allrestControllerMethod() {
} /**
* Around 手动控制调用核心业务逻辑,以及调用前和调用后的处理,
*
* 注意:当核心业务抛异常后,立即退出,转向afterReturning 执行完afterReturning,再转到AfterThrowing
*
* @param joinPoint
* @return
* @throws Throwable
*/
@Around("allControllerMethod()||allrestControllerMethod()")
public Object Around(final ProceedingJoinPoint joinPoint) throws Throwable {
logger.info("----Around Start 请求时间:{}----", dateTimeFormat.format(new Date()));
logger.info("---请求前 beforeMethod");
final Object obj = joinPoint.proceed();
logger.info("---请求后 afterReturning");
logger.info("----Around End 请求时间:{}----", dateTimeFormat.format(new Date()));
return obj;
} /**
* 在核心业务执行前执行。
*
* @param joinPoint
* @throws InterruptedException
*/
@Before("allControllerMethod() || allrestControllerMethod()")
public void beforeMethod(final JoinPoint joinPoint) throws InterruptedException {
logger.info("--beforeMethod Start 请求时间:{}--", dateTimeFormat.format(new Date()));
final ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder
.getRequestAttributes();
final HttpServletRequest request = servletRequestAttributes.getRequest();
final String requestUrl = request.getRequestURI().toString();
final int jpsHashCode = joinPoint.getSignature().hashCode();
logger.info("访问序号:{},请求路径:{},访问请求参数对象 : {}", jpsHashCode, requestUrl, Arrays.toString(joinPoint.getArgs()));
logger.info("--beforeMethod End 请求时间:{}--", dateTimeFormat.format(new Date()));
} }
最新文章
- sql server多重行列转置的优化
- ASP.NET MVC4 URL传递汉字参数不能正确接收
- SharePoint Fundation 2013中SecurityTokenServiceApplication错误
- android NDK入门 windows下安装cygwin
- UVa 102 - Ecological Bin Packing(规律,统计)
- ASP.NET Web API路由规
- js中的条件语句
- 获取app版本号
- 判断滑动方向UITableView
- mySQL优化 my.ini 配置说明
- JSON数据格式介绍
- 一个文字无缝滚动的jQuery插件
- Linux_window与linux之间文件互传,上传下载
- 【USACO】又买饲料 单调队列dp
- 浅析String类
- 409 javascript if and while表达式
- suList() 和 asList()
- 一道有意思的多线程面试题 C# 代码实现
- C#中委托如何使用?(转帖)
- hadoop程序MapReduce之WordCount