1.做日志或者做统一处理的返回,会用到AOP,写法很多,记录下
@Aspect
@Component
public class ErpResponseLogAspect {
@Pointcut("execution(* com.aa.bbb.controller..xxxController.*(..)) || execution(* com.aa.bbb.controller..yyyController.*(..))")
public void pointcut() {
}
@Around("pointcut()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
String controller = pjp.getTarget().getClass().getSimpleName();
String method = pjp.getSignature().getName();
String args = Arrays.toString(pjp.getArgs());
LogHelper.i(this.getClass(), "请求参数:" + controller + method + args);
Object ret = pjp.proceed();
LogHelper.i(this.getClass(), "响应数据:" + JSONObject.toJSONString(ret));
return ret;
}
}
这么写就行了。
@Pointcut是切点
@Around是在切点前后执行的
pjp.proceed();是执行切点方法,写在这个前后的就是我们代理的内容
当然,还有其他的
前置通知 @Before(“poincut()”)
后置通知 @After(“poincut()”)
返回时通知 @AfterReturning(pointcut = “poincut()”,returning = “object”) returning指定返回对象。
抛出异常时通知 @AfterThrowing(“poincut()”)
可以看下
https://blog.csdn.net/small_mouse0/article/details/76647357
还有execution表达式
execution(<修饰符模式>? <返回类型模式> <方法名模式>(<参数模式>) <异常模式>?) 除了返回类型模式、方法名模式和参数模式外,其它项都是可选的
分为两种,
第一种是通过方法匹配的
execution(* * *(..))
例子就是
public String eat(Food food)
第一个是权限符号,第二个是返回类型,然后是方法名(*eat),然后是入参。
execution(* com.dji.mis.controller..ReceiptImportThreeControll.*(..))
第一个是返回类型,然后是包路径,到 .. 的时候是类名
可以试验一下是否切入
注意的是:在spring中,controller需要是public的才可以进行切入,否则无效
还需要加上<aop:aspectj-autoproxy proxy-target-class="true"/>
原理抄一下
在项目中,一般都会在spring mvc配置文件中配置全盘扫描Controller,在Spring配置文件中配置扫描其它需要的注解。因此,有可能你在spring配置文件中添加了<aop:aspectj-autoproxy/>能识别@Aspect且作用于其它层的aop能正常运行,但作用于Controller的aop却无法生效。
解决方法:在spring mvc配置文件中也添加
<aop:aspectj-autoproxy proxy-target-class="true"/>
具体原因:
首先我们得先了解一下,服务器启动时Webapp的web.xml中配置的加载顺序
启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点。
紧急着,容创建一个ServletContext(servlet上下文),这个web项目的所有部分都将共享这个上下文。
容器将<context-param>转换为键值对,并交给servletContext。
容器创建<listener>中的类实例,创建监听器。
加载顺序是:ServletContext -> context-param -> listener -> filter -> servlet
Spring是listener ,因此其配置文件会先于Spring mvc的servlet加载。
执行Spring配置文件后,Spring会创建一个WebApplicationContext上下文,称为父上下文(父容器);spring mvc可以同时配置多个,每个 DispatcherServlet有一个自己的上下文对象(WebApplicationContext),称为子上下文(子容器)。
子上下文可以访问父上下文中的内容,但父上下文不能访问子上下文中的内容。
因此父容器中的<aop:aspectj-autoproxy/>不能作用到子容器才扫描的Controller。
---------------------
作者:雪霁初晴
来源:CSDN
原文:https://blog.csdn.net/qq_35242758/article/details/79669646
版权声明:本文为博主原创文章,转载请附上博文链接!