您好!欢迎来到聚码网

聚码网

热门搜索: 相亲小程序    搭子源码    直播系统自有商城   
  • java-原生CGLib内部方法互相调用时可以代理,但基于CGLib的SpringAOP却代理失效,为什么?
  • 聚码交流
  • 0 4
  • yhuxAvNbtxUM
    0000-00-00 00:00:00
  • 回帖
下面是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();}@OverridepublicObjectintercept(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方法没有被代理。为什么会有这样的差异?
最近热帖
近期热议
联系我们
Q Q:317563994
电话:400-000-000
邮箱:317563994@qq.com
时间:09:00 - 17:00