为了账号安全,请及时绑定邮箱和手机立即绑定

java cglib动态代理

java cglib动态代理

慕尼黑5688855 2019-01-17 01:21:46
cglib动态代理,为什么a()调用当前类的b(),这个b()是父类的b(),而不是cglib生成的子类的b()呢? @Component public class MyTest { public void a() { System.out.println("it's a"); b(); } public void b() { System.out.println("it's b"); } } @Aspect @Component @Slf4j @Getter public class AspectLog { @Pointcut("execution(public * com.vae1970.demo.aspect.MyTest.*(..))") public void pointcut() { } @Before("pointcut()") public void before(JoinPoint jp) { Method method = (MethodSignature) jp.getSignature().getMethod(); System.out.println("log: function " + method.getName()); } } @RestController public class TestController { @Autowired private MyTest myTest; @GetMapping("/aspect") public String aspect() { myTest.a(); return "ok"; } } 期望输出 log: function a it's a log: function b it's b 实际输出 log: function a it's a it's b 我查看了cglib生成的MyTest类,a()和b()都做了代理,那为什么实际执行的时候,没有执行代理类的b()呢?
查看完整描述

2 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

因为代理类实际调用的就是原方法。
只不过在原方法的前后增加了自定义的方法,生成的代理类而已。
在spring中用cglib你可以看org.springframework.aop.framework.CglibAopProxy.DynamicAdvisedInterceptor类里的intercept()方法,最终执行你的a()方法的是下面这句

retVal = methodProxy.invoke(target, argsToUse);

其中这个target参数就是被代理的实体类,即你这里的myTest属性(没被代理的类)

查看完整回答
反对 回复 2019-02-12
  • 2 回答
  • 0 关注
  • 455 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信