Spirng的AOP的动态代理实现机制有两种,分别是:
1)JDK动态代理:
具体实现原理:
1、通过实现InvocationHandlet接口创建自己的调用处理器
2、通过为Proxy类指定ClassLoader对象和一组interface来创建动态代理
3、通过反射机制获取动态代理类的构造函数,其唯一参数类型就是调用处理器接口类型
4、通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数参入
JDK动态代理是面向接口的代理模式,如果被代理目标没有接口那么Spring也无能为力,
Spring通过java的反射机制生产被代理接口的新的匿名实现类,重写了其中AOP的增强方法。
2、CGLib动态代理
CGLib是一个强大、高性能的Code生产类库,可以实现运行期动态扩展java类,Spring在运行期间通过 CGlib继承要被动态代理的类,重写父类的方法,实现AOP面向切面编程呢。
两者对比:
JDK动态代理是面向接口,在创建代理实现类时比CGLib要快,创建代理速度快。
CGLib动态代理是通过字节码底层继承要代理类来实现(如果被代理类被final关键字所修饰,那么抱歉会失败),在创建代理这一块没有JDK动态代理快,但是运行速度比JDK动态代理要快。
使用注意:
如果要被代理的对象是个实现类,那么Spring会使用JDK动态代理来完成操作(Spirng默认采用JDK动态代理实现机制)
如果要被代理的对象不是个实现类那么,Spring会强制使用CGLib来实现动态代理。
那么如何选择的使用代理机制了?

通过配置Spring的中<aop:config>标签来显示的指定使用动态代理机制 proxy-target-class=true表示使用CGLib代理,如果为false就是默认使用JDK动态代理
类是对物体特征的抽象,切面是对横切性关注点的抽象
本文详细介绍了Spring AOP中的两种动态代理机制——JDK动态代理和CGLib动态代理。JDK动态代理基于接口实现,适用于有接口的目标对象,而CGLib则通过字节码技术为无接口类创建子类。JDK代理创建速度快,但需目标对象有接口;CGLib创建速度慢些,但运行效率高。Spring默认使用JDK代理,若目标对象无接口,则切换到CGLib。选择代理机制可通过在Spring配置中指定`proxy-target-class`属性。
&spm=1001.2101.3001.5002&articleId=123191208&d=1&t=3&u=5d3ffcb060cb4388865d6663469cd29c)
3114

被折叠的 条评论
为什么被折叠?



