Spring AOP

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 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值