Spring-AOP 及 AOP获取request各项参数操作

在spring配置中配置下面一句:

<aop:aspectj-autoproxy />

或者使用注解:

@EnableAspectJAutoProxy

2.通知类型介绍

(1) Before:在目标方法被调用之前做增强处理,@Before只需要指定切入点表达式即可

(2) AfterReturning:在目标方法正常完成后做增强,@AfterReturning除了指定切入点表达式后,还可以指定一个返回值形参名returning,代表目标方法的返回值

(3) AfterThrowing:主要用来处理程序中未处理的异常,@AfterThrowing除了指定切入点表达式后,还可以指定一个throwing的返回值形参名,可以通过该形参名

来访问目标方法中所抛出的异常对象

(4) After:在目标方法完成之后做增强,无论目标方法时候成功完成。@After可以指定一个切入点表达式

(5) Around:环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型,像事务,日志等都是环绕通知,注意编程中核心是一个ProceedingJoinPoint

3.通知执行的优先级

进入目标方法时,先织入Around,再织入Before,退出目标方法时,先织入Around,再织入AfterReturning,最后才织入After。

注意:Spring AOP的环绕通知会影响到AfterThrowing通知的运行,不要同时使用!同时使用也没啥意义。

4.切入点的定义和表达式

切入点表达式的定义算是整个AOP中的核心,有一套自己的规范

Spring AOP支持的切入点指示符:

execution:用来匹配执行方法的连接点

A:@Pointcut(“execution(* com.aijava.springcode.service….(…))”)

第一个表示匹配任意的方法返回值,…(两个点)表示零个或多个,上面的第一个…表示service包及其子包,第二个表示所有类,第三个*表示所有方法,第二个…表示

方法的任意参数个数

B:@Pointcut(“within(com.aijava.springcode.service.*)”)

within限定匹配方法的连接点,上面的就是表示匹配service包下的任意连接点

C:@Pointcut(“this(com.aijava.springcode.service.UserService)”)

this用来限定AOP代理必须是指定类型的实例,如上,指定了一个特定的实例,就是UserService

D:@Pointcut(“bean(userService)”)

bean也是非常常用的,bean可以指定IOC容器中的bean的名称

下面是一个使用AOP获取统计计算方法执行时间以及获取request请求参数等信息的log方法:

/**

  • description:

  • 统计请求执行时间

  • @author wkGui

*/

@Component

@Aspect

public class ResExeTimeCounter {

private static Logger logger = LoggerFactory.getLogger(ResExeTimeCounter.class);

@Pointcut(“execution(* com.wk.controller….(…))”)

public void pointCut() {

}

@Around(“pointCut()”)

public Object around(ProceedingJoinPoint pjp) throws Throwable {

RequestAttributes ra = RequestContextHolder.getRequestAttributes();

ServletRequestAttributes sra = (ServletRequestAttributes) ra;

assert sra != null;

HttpServletRequest request = sra.getRequest();

String url = request.getRequestURL().toString();

String method = request.getMethod();

String queryString = request.getQueryString();

long startTime = System.currentTimeMillis();

logger.info(“{url:{}, method:{}, queryString:{}}”, url, method, queryString);

Object rs;

boolean successAble = false;

JsonObject paramsJson = new JsonObject();

try {

Object[] params = pjp.getArgs();

for (int i = 0; i < params.length; i++) {

if (params[i] instanceof BindingResult

|| params[i] instanceof HttpRequest

|| params[i] instanceof HttpResponse){

continue;

}

paramsJson.addProperty(“param-” + i, JsonUtil.toJsonWtihNullField(params[i]));

}

rs = pjp.proceed();

successAble = true;

} finally {

logger.info(“{url:{}, method:{}, success-able:{}, exe-time:{}, params:{}}”, url, method, successAble, System.currentTimeMillis() - startTime, paramsJson);

}

return rs;

}

}

SpringAOP获取request中所有参数,记录用户操作日志


今天搞了一个AOP的管理日志,蛋疼的很…

老规矩贴代码吧

总结

其他的内容都可以按照路线图里面整理出来的知识点逐一去熟悉,学习,消化,不建议你去看书学习,最好是多看一些视频,把不懂地方反复看,学习了一节视频内容第二天一定要去复习,并总结成思维导图,形成树状知识网络结构,方便日后复习。

这里还有一份很不错的《Java基础核心总结笔记》,特意跟大家分享出来

目录:

部分内容截图:


,学习,消化,不建议你去看书学习,最好是多看一些视频,把不懂地方反复看,学习了一节视频内容第二天一定要去复习,并总结成思维导图,形成树状知识网络结构,方便日后复习。

这里还有一份很不错的《Java基础核心总结笔记》,特意跟大家分享出来

目录:

[外链图片转存中…(img-N7yl1KfN-1721154978437)]

部分内容截图:

[外链图片转存中…(img-pNLbtx7b-1721154978438)]

[外链图片转存中…(img-rvPhZrMg-1721154978438)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值