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
属性(没被代理的类)
添加回答
举报
0/150
提交
取消