spring cglib 与 jdk 动态代理
程序员文章站
2024-02-24 15:10:06
1. 概述
jdk动态代理是利用java反射机制 生成一个实现接口的匿名类, 在调用具体方法前调用invocationhandler来处理
cglib动态代理是 利用a...
1. 概述
jdk动态代理是利用java反射机制 生成一个实现接口的匿名类, 在调用具体方法前调用invocationhandler来处理
cglib动态代理是 利用asm开源包 把被代理类的class文件加载进来 通过修改其字节码生成子类来处理
如果目标对象实现了接口 那么默认使用jdk代理(可以强制使用cglib代理)
如果没有实现接口 必须使用cglib代理
强制使用cglib代理需要
*引入cglibjar包
*配置spring <aop:aspectj-autoproxy proxy-target-class="true"/>
cglib因为是动态生成被代理类的子类 并覆盖被代理类的方法 来实现的 所以 被代理方法不要使用final修饰
2. 代码示例
2.1 cglib代理类
package com.rocky.spring; import java.lang.reflect.method; import net.sf.cglib.proxy.enhancer; import net.sf.cglib.proxy.methodinterceptor; import net.sf.cglib.proxy.methodproxy; public class cglibproxy { public static void main(string[] args) { final userservice service = new userservice(); enhancer hancer = new enhancer(); hancer.setsuperclass(service.getclass()); hancer.setcallback(new methodinterceptor(){ @override public object intercept(object proxy, method method, object[] arg2, methodproxy arg3) throws throwable { system.out.println("增强前 ... cglib"); object invoke = method.invoke(service, arg2); system.out.println("增强后 ... cglib"); return invoke; }}); userservice userservice = (userservice) hancer.create(); userservice.sayhello(); } } //需要引入cglib-2.2.jar 和org.objectweb.asm-3.3.1.jar //输出 //增强前 ... cglib //this userservice works.... //增强后 ... cglib
被代理类userservice
package com.rocky.spring; public class userservice { public void sayhello(){ system.out.println("this userservice works...."); } }
2.2 jdk代理接口
package com.rocky.spring; import java.lang.reflect.invocationhandler; import java.lang.reflect.method; import java.lang.reflect.proxy; public class jdkproxy { public static void main(string[] args) { final actorservice service = new actorserviceimpl(); actorservice actorservice = (actorservice) proxy.newproxyinstance( service.getclass().getclassloader(), service.getclass() .getinterfaces(), new invocationhandler() { @override public object invoke(object proxy, method method, object[] args) throws throwable { system.out.println("增强前...jdk"); object invoke = method.invoke(service, args); system.out.println("增强后...jdk"); return invoke; } }); actorservice.sayhi(); } } //增强前...jdk //honestly, i do the work. //增强后...jdk
被代理接口及实现类
package com.rocky.spring; public interface actorservice { public void sayhi(); } ----------------- package com.rocky.spring; public class actorserviceimpl implements actorservice { @override public void sayhi() { dosomething(); } private void dosomething() { system.out.println("honestly, i do the work."); } }
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
上一篇: 详解Java的按位操作符