在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)]