SpringAOP嵌套调用的解决办法
来源:互联网 发布:手机java微信怎么登陆 编辑:程序博客网 时间:2024/05/19 22:46
Spring AOP在同一个类里自身方法相互调用时无法拦截。比如下面的代码:
由于java这个静态类型语言限制,最后想到个曲线救国的办法,出现这种特殊情况时,不要直接调用自身方法,而通过AOP代理后的对象。在实现里保留一个AOP代理对象的引用,调用时通过这个代理即可。比如:
但这个代理对象还要我们手动set进来,幸好SpringBeanFactory有BeanPostProcessor扩展,在bean初始化前后会统一传递给BeanPostProcess处理,繁琐的事情就可以交给程序了,代码如下,首先定义一个BeanSelfAware接口,实现了此接口的程序表明需要注入代理后的对象到自身。
用XmlBeanFactory进行测试需要注意,所有的BeanPostProcessor并不会自动生效,需要执行以下代码:
两个方法经过AOP代理,执行时都实现系统日志记录。单独使用someInnerMethod时,没有任何问题。但someMethod就有问题了。someMethod里调用的someInnerMethod方法是原始的,未经过AOP增强的。我们期望调用一次someMethod会记录下两条系统日志,分别是someInnerMethod和someMethod的,但实际上只能记录下someMethod的日志,也就是只有一条。在配置事务时也可能会出现问题,比如someMethod方法是REQUIRED,someInnerMethod方法是REQUIRES_NEW,someInnerMethod的配置将不起作用,与someMethod方法会使用同一个事务,不会按照所配置的打开新事务。
由于java这个静态类型语言限制,最后想到个曲线救国的办法,出现这种特殊情况时,不要直接调用自身方法,而通过AOP代理后的对象。在实现里保留一个AOP代理对象的引用,调用时通过这个代理即可。比如:
但这个代理对象还要我们手动set进来,幸好SpringBeanFactory有BeanPostProcessor扩展,在bean初始化前后会统一传递给BeanPostProcess处理,繁琐的事情就可以交给程序了,代码如下,首先定义一个BeanSelfAware接口,实现了此接口的程序表明需要注入代理后的对象到自身。
再定义一个BeanPostProcessor,beanFactory中的每个Bean初始化完毕后,调用所有BeanSelfAware的setSelf方法,把自身的代理对象注入自身……
最后,在BeanFactory配置中组合起来,只需要把BeanPostProcesser加进去就可以了,比平常多一行配置而已。
这里的someService#someInnerMethod就表现出预期的行为了,无论怎样,它都是经过AOP代理的,执行时都会输出日志信息。
用XmlBeanFactory进行测试需要注意,所有的BeanPostProcessor并不会自动生效,需要执行以下代码:
0 0
- SpringAOP嵌套调用的解决办法
- SpringAOP嵌套调用的解决办法
- SpringAOP嵌套调用的解决办法
- SpringAOP嵌套调用的解决办法
- SpringAOP功能自我调用的解决方案
- 嵌套注释的解决办法
- Makfile的嵌套调用
- Makefile的嵌套调用
- springAOP——代理对象的产生及方法调用
- ScrollView嵌套GridView的解决办法
- ScrollView嵌套GridView的解决办法
- ScrollView嵌套GridView的解决办法
- ScrollView嵌套GridView的解决办法
- ScrollView嵌套GridView的解决办法
- ScrollView嵌套GridView的解决办法
- ScrollView嵌套GridView的解决办法
- ScrollView嵌套ListView的解决办法
- ScrollView嵌套GridView的解决办法
- Veebot-自动静脉抽血机器人
- java中Integer包装类的详细讲解(java二进制操作,所有进制转换)
- iOS crash Log 理解1
- <nine-patch> requires a valid 9-patch source image
- ZigBee学习之17——ZStack API解读5
- SpringAOP嵌套调用的解决办法
- 关于SafeMove White Paper功能
- 一个常见的优先级问题
- golang sync mutex 互斥锁
- 5.7
- TestException
- Generating Your Development Certificate
- printf格式控制符的完整格式
- 线程与Handler(1)