猿问

java cglib动态代理

cglib动态代理,为什么a()调用当前类的b(),这个b()是父类的b(),而不是cglib生成的子类的b()呢?
@Component
publicclassMyTest{
publicvoida(){
System.out.println("it'sa");
b();
}
publicvoidb(){
System.out.println("it'sb");
}
}
@Aspect
@Component
@Slf4j
@Getter
publicclassAspectLog{
@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());
}
}
@RestController
publicclassTestController{
@Autowired
privateMyTestmyTest;
@GetMapping("/aspect")
publicStringaspect(){
myTest.a();
return"ok";
}
}
期望输出
log:functiona
it'sa
log:functionb
it'sb
实际输出
log:functiona
it'sa
it'sb
我查看了cglib生成的MyTest类,a()和b()都做了代理,那为什么实际执行的时候,没有执行代理类的b()呢?
一只萌萌小番薯
浏览 468回答 2
2回答

梵蒂冈之花

因为代理类实际调用的就是原方法。只不过在原方法的前后增加了自定义的方法,生成的代理类而已。在spring中用cglib你可以看org.springframework.aop.framework.CglibAopProxy.DynamicAdvisedInterceptor类里的intercept()方法,最终执行你的a()方法的是下面这句retVal=methodProxy.invoke(target,argsToUse);其中这个target参数就是被代理的实体类,即你这里的myTest属性(没被代理的类)
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答