springaop静态代理和动态代理,Spring AOP中动态代理的两种实现方式及其过程
00-1010 Spring AOP 1原理。JDK动态代理2。CGLIB动态代理3。如何在Spring项目中强制CGLIB代理
00-1010Spring的AOP是通过动态代理实现的。当配置一个Bean或一些Bean的方面时,Spring将为它创建一个代理对象。当调用这个对象的方法时,它实际上调用的是生成的代理类的对象方法。Spring的Aop主要使用了两个动态代理,即JDK动态代理和CGLIB动态代理。
00-1010如果代理类实现了接口,Spring将默认使用JDK动态代理。JDK的动力基于反思。JDK通过反射生成一个代理类,它实现原始类的所有接口,并代理接口中定义的所有方法。当我们通过代理对象执行原类的方法时,代理类的底层会调用我们通过反射机制实现的InvocationHandler接口的invoke方法。
/* *接口类*/公共接口person { void say();} *接口实现类公共类Man实现Person { Private String Wordpublic Man(字符串字){ this.word=word} public Man(){ public void Say(){ system . out . println( Man Can Say word);Class public manjdkproxy实现调用处理程序{/* * *必需的代理对象*/私有对象o;公共对象bind(Object o){ this . o=o;返回proxy . newproxyinstance(o . getclass()。getClassLoader(),o.getClass()。getInterfaces(),this);@ Override public Object invoke(Object Proxy,Method方法,Object[] args)抛出Throwable { system . out . println( JDK代理设计);返回method.invoke(o,args);/** * JDK动态代理公共类代理设计_ 2 {公共静态void main(string[]args){ man man=Newman( hello );Person p=(Person)new ManJDKProxy()。bind(人);p . say();* JDK动态代理的优点和缺点
优点:1。JDK动态代理是JDK本地的,所以它可以在没有任何依赖性的情况下使用。2.通过反射机制生成代理类的速度比CGLib操作字节码的速度要快。缺点:1。如果要使用JDK动态代理,代理类必须实现接口。否则不可能是InvocationHandler) 23。JDK动态代理无法为接口中未定义的方法实现代理。3.JDK动态代理在执行代理方法时,需要通过反射机制进行回调,此时方法执行的效率相对较低。
00-1010如果需要代理的类没有实现接口,则不能使用JDK的动态代理。Spring将使用CGLiB动态代理来生成代理对象。CGLiB直接操纵字节码,生成类的子类,并覆盖类的方法来完成代理。
/* *接口类*/公共接口person { void say();} *接口实现类公共类Man实现Person { Private String Wordpublic Man(字符串字){ this.word=word} public Man(){ public void Say(){ system . out . println( Man Can Say word);public class manglibproxy { public Object bind(Object target){ Enhancer Enhancer=new Enhancer();enhancer . set super class(target . getclass());enhancer . set callback(new Method interceptor(){ @ Override public Object intercept(Object o,Method method,Object[] objects,MethodProxy methodProxy)抛出Throwable { system . out . println( CGLIB Proxy Design );返回method.invoke(target,objects);} });return enhancer . create();/** * CGLIB动态代理公共类proxy design _ 3 { public static void main(string[]args){ man man=Newman( hello );Person p=(Person)new manglibproxy()。bind(人);p . say();* CGLIB动态代理的优缺点
优点:1。使用CGLib代理的类不需要实现接口,因为CGLiB生成的代理类直接继承了需要代理的类。2.因为CGLiB是通过重写父类实现的,所以没有办法代理最终方法或私有方法。3.CGLiB是通过修改字节码生成的代理类。因此,CGLib的代理方法的效率高于JDK的动态代理方法。因为CGLiB是通过重写父类来实现的,所以没有办法代理最终方法或者私有方法;2.因为CGLiB通过操作字节码(asm工具包)生成代理类,所以这种生成的代理类不如JDK通过反射生成的代理类高效。
目录
* xml模式
!-AOP:Config用于配置xml中的切面,指定proxy-target-class= true -AOP : config proxy-target-class= true !- AOP相关配置-/aop:config * @方面注释方法
!-将proxy-target-class配置设置为true-AOP : AspectJ-auto proxy-target-class= true /*配置类的注释方法。
在此添加@ EnableAspectJautoProxy(ProxyTargetClass=true)。本文介绍了SpringAop的实现原理和代理模式。关于SpringAop代理模式的更多信息,请搜索Popular IT之前的文章或者继续浏览下面的相关文章。我希望你以后能更多地支持流行音乐!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。