spring中aop无法切到service内部调用的方法

原创 2018年04月17日 20:22:54

首先,特别鸣谢周先生做的测试代码。

一。场景描述 

有一个控制层类OutStoreOverController(简称controller),依赖了XsCustomorExpenseOperateServiceImpl(简称service)类。controller在2个不同方法中分别调用了service的siteDeliverySettlement 和stockDownAccounts方法(分别简称为m1和m2)。m1和m2在具体实现的时候又调用了service的内部方法createExpense(申明为public,简称为m3) 

方法调用的时序图如下:

现在有一个切面StorageOperateOMSAopServiceImpl,需要切createExpense(m3)方法,在m3方法执行前做点事情。经过配置后,运行发现m3方法并没有被切到。

二。问题分析

当controller构建实例的时候,注入service实例的时候,发现其有切面,产生了代理类serviceProxy并注入给了controller。

实际调用的时序图如下:


这样就导致m3方法根本没有被切面切入。虽然controller第一次调用的是代理类,但是在调用m3方法的时候是调用的service实例内部的m3方法,所以切面没有生效。

三。问题解决

原来m1、m2方法调用m3方法时为:

XXXXXXXXXX;

m3();

XXXXXXXX;

修改后的写法为:

XXXXXXXX;

Service serviceTemp=ApplicationContextUtil.getBean(Service.class);

serviceTemp.m3();

XXXXXX;

修改后调用的时序图为:


真正使切面生效的就是

Service serviceTemp=ApplicationContextUtil.getBean(Service.class);

这一行代码。向spring容器拿的实例,实际上是代理类servciceProxy。调用代理类的m3方法就会去先执行aop中前置切面代码,再会调用真正service实例的m3方法。最终,aop才有效果了。需要理解基于动态代理的aop原理。

spring AOP中自身方法调用无法应用代理解决办法

spring AOP中自身方法调用无法应用代理解决办法 AopContext
  • tangtong1
  • tangtong1
  • 2017-02-06 15:40:29
  • 1063

Spring AOP无法拦截对象的内部方法调用问题

参考: http://fyting.iteye.com/blog/109236
  • luojinbai
  • luojinbai
  • 2017-01-19 08:20:14
  • 1459

spring之aop方法内部调用问题

现象描述:假设有一个service,其中有A B 两个方法,A B都被aop托管,且A中调用了B方法,这时请求方法A的时候只会触发A的aop逻辑而不会触发B的aop逻辑。public interfac...
  • nieyanshun_me
  • nieyanshun_me
  • 2017-07-09 21:20:48
  • 1582

spring aop类内部调用不拦截原因及解决方案

spring对应java web开发的同学来说,都不陌生,其中事务@Transactional在service层更是常常使用。 1.aop类内部调用不拦截原因 细心的同学也许早就发现当servic...
  • dream_broken
  • dream_broken
  • 2017-06-08 11:51:09
  • 3503

spring aop之对象内部方法间的嵌套失效

spring aop之对象内部方法间的嵌套失效 先看一下spring 代理原理: *       spring代理嵌套方法调用不生效  *   *       Spring AOP d...
  • doctor_who2004
  • doctor_who2004
  • 2016-07-03 12:09:11
  • 4705

(原创)spring AOP 在service 层 不执行

先上代码 @Service public class TestServiceImpl implements TestServiceI{ private ExecutorService ...
  • EgbertYu
  • EgbertYu
  • 2017-12-07 18:08:23
  • 254

AOP 同类方法调用无法进入切面

在做项目的时候遇到这样一个问题,需要在service层进行动态数据源的切换,因此,在service层定义了一个切面,只要方法进入我就判断参数,通过一个参数来进行数据源的切换,但是后来发现在同一个类中进...
  • fjkxyl
  • fjkxyl
  • 2017-03-16 11:36:52
  • 1044

Spring AOP不拦截从对象内部调用的方法原因

拦截器的实现原理很简单,就是动态代理,实现AOP机制。当外部调用被拦截bean的拦截方法时,可以选择在拦截之前或者之后等条件执行拦截方法之外的逻辑,比如特殊权限验证,参数修正等操作。   但是最近在...
  • TianDiYiShaOu_
  • TianDiYiShaOu_
  • 2016-04-21 10:10:34
  • 1604

笔记有关在spring使用aop在实现service层时出现的问题

java.lang.IllegalStateException: Failed to check the status of the service com.groupds.api.Discharge...
  • sinat_36201917
  • sinat_36201917
  • 2016-12-22 18:55:36
  • 575

spring aop 同一个bean中方法调用方法

public class SomeBean {       public void methodA() {           this.methodB();       }        ...
  • u013269532
  • u013269532
  • 2016-08-30 17:25:42
  • 1337
收藏助手
不良信息举报
您举报文章:spring中aop无法切到service内部调用的方法
举报原因:
原因补充:

(最多只允许输入30个字)