首页 > 编程知识 正文

静态代理和动态代理的优缺点,spring ioc和aop原理

时间:2023-05-04 18:31:21 阅读:26146 作者:4318

摘要静态代理和动态代理静态代理手动代理interfacepublicinterfaceinterface _ { public void do (}; }增强的类public class object _ implements interface _ { @ overridepublicvoiddo (} { system.out.println ) ' do ); }代理类public class object _ agentimplementsinterface _ { private object _ object _; publicobject _ agent (object _ object _ ) { this.object_=object_; } @Override public void do () system.out.println ) ) Enhance ); object_.do (; } publicstaticvoidmain (string [ ] args ) { Object_ object_=new Object_ (); 对象_代理代理=new object _ agent (对象_; 代理. do (; Aspectj静态建模方法与spring aop相同,Aspectj在编译时将代码嵌入class文件中,而不是动态地在运行时生成代理类。 由于是静态嵌入的,所以JDK动态代理是基于接口的方式,代理类和目标类都实现相同的接口。 CGLib动态代理是代理类继承目标类并重写其中的目标类的方法。 JDK动态代理接口publicinterfaceinterface _ { public void do (; }增强的类public class object _ implements interface _ { @ overridepublicvoiddo (} { system.out.println ) ' do ); 处理器实现类publicclassinvocationhandlerimplimplementsinvocationhandler { privateobjectobject; publicinvocationhandlerimpl (objectobject ) { this.object=object; } publicobjectinvoke (对象代理,方法方法,对象[ ] args ) throws throwable (系统. out.println (增强' ) ) objectobject=method.invoke (object,args ); 返回对象; }测试publicclassdynamicproxydemonstration { publicstaticvoidmain (string [ ] args (接口_ object _=new object _ ) ) class loader loader=object _.getclass ().getClassLoader ); class [ ]接口=object _.getclass (.get接口); 接口_ object _ _=(接口_ ) proxy.newproxyinstance(loader,接口,handler ); object__.do (; } }需要增强} } CGlib动态代理pomdependencygroupidcglib/groupidartifactidcglib/artifactidversion2.2.2/version/dependency的库方法断路器publicclassmymethodinterceptorimplementsmethodinterceptor { @ overridepublicobjectintercept (对象元,方法元方法元objectobject=proxy.invoke super (obj,args ); 返回对象; } publicclasscglibproxy { publicstaticvoidmain (字符串[ ] args () JDK动态代理的proxy类等增强器对象,然后单击几个参数为目标类设置字节码文件enhancer.set super class (object _.class )//回调函数enhancer.set callback (newmymethodintercercesk ) //object_proxyobject_=(object_ ) enhancer.create ); proxyObject_.do (; }为什么CGlib上会写代码呢?

@ autowireduserserviceuserservice; 错误代码:

@ autowireduserserviceimpluserservice;

JDK动态代理是基于接口的,代理生成的对象只能分配给接口变量。

中情局没有这个问题。 因为CGLIB是通过生成子类实现的,所以无论代理对象是分配给接口还是分配给实现类,代理对象都是代理对象的父类。

摘要Spring5缺省aop实现为CGlibJDK动态代理,CGlib动态代理是基于继承的参考[1].CGLib动态代理

[2].java反射和代理

[3] .好厉害! 默认情况下,Spring5 AOP是否使用Cglib? 从现象到源代码的深度分析

作者: Both Savage

本文介绍了:3359 both savage.github.io/2020/12/29/spring boot/spring boot系列(2)——AOP-静态代理和动态代理/

版权声明:除特殊声明外,本博客中的所有文章均采用BY-NC-SA许可协议。 请注明出处!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。