原生CGLib内部方法互相调用时可以代理,但基于CGLib的Spring AOP却代理失效,为什么?

下面是CGLib的原生写法(使用net.sf.cglib.proxy.*包内的类实现)
classFoo{
publicvoidfun1(){
System.out.println("fun1");
fun2();
}
publicvoidfun2(){
System.out.println("fun2");
}
}
classCGlibProxyEnhancerimplementsMethodInterceptor{
publicObjectgetProxy(Classclazz){
Enhancerenhancer=newEnhancer();
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
returnenhancer.create();
}
@Override
publicObjectintercept(Objectobj,Methodmethod,Object[]args,MethodProxyproxy)throwsThrowable{
System.out.print("before");
Objectresult=proxy.invokeSuper(obj,args);
returnresult;
}
}
publicclassTest{
publicstaticvoidmain(String[]args){
CGlibProxyEnhancerpf=newCGlibProxyEnhancer();
Foofoo=(Foo)pf.getProxy(Foo.class);
foo.fun1();
}
}
打印结果是:beforefun1beforefun2可以看到,虽然fun2()是通过foo.fun1()调用的,但fun()2依然能被代理。
但如果用SpringAOP那套基本写法的话:
classFoo{
publicvoidfun1(){
System.out.println("fun1");
fun2();
}
publicvoidfun2(){
System.out.println("fun2");
}
}
classBeforeimplementsMethodBeforeAdvice{
publicvoidbefore(Methodmethod,Object[]objects,Objecto)throwsThrowable{
System.out.print("before");
}
}
publicclassTestCGLib{
publicstaticvoidmain(String[]args){
Foofoo=newFoo();
BeforeAdviceadvice=newBefore();
ProxyFactorypf=newProxyFactory();
pf.setOptimize(true);//启用Cglib2AopProxy创建代理
pf.setProxyTargetClass(true);
pf.setTarget(foo);
pf.addAdvice(advice);
Fooproxy=(Foo)pf.getProxy();
proxy.fun1();
}
}
输出结果是:beforefun1fun2可见fun2方法没有被代理。
为什么会有这样的差异?
湖上湖
浏览 2165回答 3
3回答

qq_宁缺毋滥_17

invoke和invokeSuper的区别,spring-aop用的invoke

HUWWW

CGLib的原生写法那个代码,你把publicvoidfun2(){System.out.println("fun2");}改成privatevoidfun2(){System.out.println("fun2");}两者的运行就一样了因为cglib的子类是增强类,增强类没继承fun2私有方法,所以fun1调的是父类的方法fun2,而不是增强类。所以私有fun2没被拦截。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript