Cglib代理如何生成的及工作原理_cglib动态代理实现原理_Alan CGH的博客-CSDN博客
1,通过spring的cglib库手动建代理对象。调用方法时是由生成的代理对象执行。
public static class MyInterceptor implements MethodInterceptor {
public Object getProxy() {
//修改存储代理类的地址
System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "C:\\Users\\Desktop");
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(Student.class);
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println(o.getClass().getSimpleName());
System.out.println(method.getName());
System.out.println(methodProxy.getSignature());
System.out.println(methodProxy.getSuperName());
return methodProxy.invokeSuper(o, objects);
}
}
public static void main(String[] args) {
MyInterceptor myInterceptor = new MyInterceptor();
Student proxy = (Student) myInterceptor.getProxy();
proxy.test01();
}
2,debug spring生成的代理类。发现spring管理的代理对象调用方法时最终是由原始的本类对象执行而不是代理对象,所以在方法中再通过this调用方法时,是通过本类对象进行调用,不会执行切面(事务等)逻辑。(由此,得出事务失效的一个场景,就是通过this调用方法时,是由本类对象调用该方法,没有执行事物的切面逻辑,所以事务不会生效,前提是当前上下文没有事务环境)
CGLIB代理:org.springframework.aop.framework.CglibAopProxy.CglibMethodInvocation#invokeJoinpoint
PROXY代理:
proxy代理的对象执行后再由cglib代理的对象调用,又回到了cglib。
org/springframework/aop/framework/JdkDynamicAopProxy.java:208
spring全局代理配置改为proxy时,proxy代理的对象调用后会直接由原始对象调用。