cglib动态代理,为什么a()调用当前类的b(),这个b()是父类的b(),而不是cglib生成的子类的b()呢?@ComponentpublicclassMyTest{publicvoida(){System.out.println("it'sa");b();}publicvoidb(){System.out.println("it'sb");}}@Aspect@Component@Slf4j@GetterpublicclassAspectLog{@Pointcut("execution(public*com.vae1970.demo.aspect.MyTest.*(..))")publicvoidpointcut(){}@Before("pointcut()")publicvoidbefore(JoinPointjp){Methodmethod=(MethodSignature)jp.getSignature().getMethod();System.out.println("log:function"+method.getName());}}@RestControllerpublicclassTestController{@AutowiredprivateMyTestmyTest;@GetMapping("/aspect")publicStringaspect(){myTest.a();return"ok";}}期望输出log:functionait'salog:functionbit'sb实际输出log:functionait'sait'sb我查看了cglib生成的MyTest类,a()和b()都做了代理,那为什么实际执行的时候,没有执行代理类的b()呢?
2 回答
梵蒂冈之花
TA贡献1900条经验 获得超5个赞
因为代理类实际调用的就是原方法。只不过在原方法的前后增加了自定义的方法,生成的代理类而已。在spring中用cglib你可以看org.springframework.aop.framework.CglibAopProxy.DynamicAdvisedInterceptor类里的intercept()方法,最终执行你的a()方法的是下面这句retVal=methodProxy.invoke(target,argsToUse);其中这个target参数就是被代理的实体类,即你这里的myTest属性(没被代理的类)
添加回答
举报
0/150
提交
取消