aop面板拷贝参数程序是遇到不适当参数是什么原因

问题:看了很多关于Spring AOP的文章在講各种切入方式(before、around、after-returnning、thrown等)时,被切入的业务主体Bean的方法基本都是无参数的。

也有提到有参数的但都是一个String型的参数。

以before为例无參数方法的切点配置为

如果方法有一个String型的参数param,则配置为

注:如果参数其实可为任何类型即Object。如果非要强调是String型参数为其他类型的方法,不想被切点切入则可写成 method="before(java.lang.String)"

但如果 cn.xxxx..*.* 的方法有多个参数,且个数不定要想让切点可以切入,这么个写法就不行了

我搜了N多的帖子,也没能找到方法最终几经辗转,终于在网友的帮助下点破了这一层窗户纸,其实也很简单还是在配置的写法:

与之配合的切点的寫法是

这样,不论业务Bean的方法有多少个参数都可以被这个切点切入了。如果需要访问各个参数只需

其实,能够满足如上需求的方法臸少还有一种,就是拦截器

 

Throwable方法)然后再交还给target属性指明的真正的ServiceBean。它不仅仅能够得到方法的参数而且还有更强的功能——决定是否繼续执行target。
 

还可以控制是否要继续执行目标方法,还是阻断因此用来做认证是再合适不过了。

为什么要加入两条分割线之间的之一段呢除了也作为before切入的另一种实现方式,更主要的是想引出下面的问题:
我发现在我成功的用AOP切入之后,每次都执行了两遍切点且我檢查了配置文件,并没有重复定义<AOP>

我发现这个target有一次是我的ServiceBean,而另一次是类似$Proxy22之类的东西这才恍然大悟,它应该是那个拦截器!也就昰说拦截器被切点切入了一次,真正的target又切入了一次
显然,从配置文件的写法上似乎是无法避免拦截器被切入的(虽然org.springframework.aop.framework.* 并不是切面)那只能在切点里想办法回避了
 
至此,可以让多参数方法被切入的before切点完成了
(after-returnning没有遇到什么障碍,多参数也很简单甚至不用在pointcut配置Φ声明,还可取到返回值)
切点可以同时得到JoinPoint和返回值
 
最后,不知道哪位晓得如果通过AOP而不是中间段落中提到的【拦截器】,来实现現有拦截器的功能即取得入口参数,并可以控制继续执行被切的业务ServiceBean还是阻止它执行。
如果能帮上我请留言,谢谢了

我要回帖

更多关于 aop面板拷贝参数 的文章

 

随机推荐