SpringMVC中配aop拦截不生效,咋回事
答案:3 悬赏:80 手机版
解决时间 2021-03-14 15:32
- 提问者网友:伴风望海
- 2021-03-14 05:28
SpringMVC中配aop拦截不生效,咋回事
最佳答案
- 五星知识达人网友:胯下狙击手
- 2021-03-14 07:04
最近由于项目原因,在Spring+SpringMVC+Mybatis的环境中,增加对controller或是service的日志监控,在网上搜了半天,按照SpringAop的配置出不了结果,在按照网上的各种配置改……,各种头疼中,无意中看到摸个高手写的一段文字突然,感觉很有意思,就这样莫名其妙的解决了。回头看,我去,别人都写好了,我们配置都不会配置,悲哀…,这就是我对各种框架一知半解,甚至不知道的结果。
首先对入口文件,web.xml分析:
还有一点,我们可以查到,加载这连个配置文件的累分别是:spring(applicationContext),SpringMVC(webApplicationContext)(希望没记错,记错了自己对应修改)
第一步,要明确,我们是在SpringMVC上aop监测,那么所有的报扫描注入都在SpringMVC的配置文件中完成,不要再spring的配置文件中完成,不然在开启代理后,发现还是没有起到任何作用。(当然,aopalliance-1.0.jar,aspectjweaver-1.8.6.jar这两个jar包不可缺少)
第二步,在SpringMVC的配置文件中开启它的代理模式:<aop:aspectj-autoproxy expose-proxy="true"></aop:aspectj-autoproxy>
第三步,进行aop监测相关方法的类的编写
最后就是一个小技巧,就是先测pointcut表达式的具体到某一个具体函数,成功后,在用.*来代替,在测,知道成功完成为止!!!!!
希望对大家有帮住,也希望有大牛深入剖析其中的原理。有看到的同学请给我转个链接,谢谢。
首先对入口文件,web.xml分析:
还有一点,我们可以查到,加载这连个配置文件的累分别是:spring(applicationContext),SpringMVC(webApplicationContext)(希望没记错,记错了自己对应修改)
第一步,要明确,我们是在SpringMVC上aop监测,那么所有的报扫描注入都在SpringMVC的配置文件中完成,不要再spring的配置文件中完成,不然在开启代理后,发现还是没有起到任何作用。(当然,aopalliance-1.0.jar,aspectjweaver-1.8.6.jar这两个jar包不可缺少)
第二步,在SpringMVC的配置文件中开启它的代理模式:<aop:aspectj-autoproxy expose-proxy="true"></aop:aspectj-autoproxy>
第三步,进行aop监测相关方法的类的编写
最后就是一个小技巧,就是先测pointcut表达式的具体到某一个具体函数,成功后,在用.*来代替,在测,知道成功完成为止!!!!!
希望对大家有帮住,也希望有大牛深入剖析其中的原理。有看到的同学请给我转个链接,谢谢。
全部回答
- 1楼网友:低血压的长颈鹿
- 2021-03-14 09:01
首先我的aop切面类文件路径有问题,后来移到了logic下的util包中;
放在spring-mvc.xml中即可。
附上拦截controller的类:
package com.ts.bg.logic.util;
import javax.servlet.http.httpservletrequest;
import org.aspectj.lang.proceedingjoinpoint;
import org.aspectj.lang.annotation.around;
import org.aspectj.lang.annotation.aspect;
import org.springframework.stereotype.component;
@component
@aspect
public class indexaoputil {
//设置切入点,匹配所有controller的toindex方法
public static final string index_list_init="execution(* com.ts.bg.controller.*.toindex(..))";
@around(index_list_init)
public object index_list_init(proceedingjoinpoint joinpoint) throws throwable{
object object =null;
object[] args = joinpoint.getargs();
if(args!=null){
httpservletrequest request=(httpservletrequest) args[0];
object=joinpoint.proceed();
//设置菜单编号
request.setattribute("menucode", request.getparameter("menucode"));
}
return object;
}
}
该类的意义:拦截所有controller目录下的controller中的toindex方法。
网上有说controller类拦截不到,用其他方式,我试过了,不行。
可能和spring版本有关系,我的是spring4.x。
- 2楼网友:毛毛
- 2021-03-14 07:27
spring整合事物使用aop的,你可以参考一下
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="create*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
<tx:method name="select*" propagation="SUPPORTS" read-only="true" />
<tx:method name="get*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:advisor advice-ref="txAdvice"
pointcut="execution(* com.service.*.*(..))" />
</aop:config>
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯