深入探索spring技术内幕(六): JDK动态代理和cglib生成代理
来源:互联网 发布:姚明奥运会数据 编辑:程序博客网 时间:2024/06/04 20:43
[ JDK生成代理 ]
JDK中给我们提供了一个Proxy类可以动态的给我们生成代理.
假定我们要做一个权限管理系统, 需要控制用户对某一个方法的访问. 如果user为null, 那么不让用户访问save方法.
① 接口类: PersonService
public interface PersonService {public void save();}
② 实现类: PersonServiceImpl
public class PersonServiceImpl implements PersonService {private String user;public PersonServiceImpl(){}public PersonServiceImpl(String user) {this.user = user;}public void save() {System.out.println("执行了save()方法");}public String getUser() {return user;}}
③ 生成代理类工厂: JDKProxyFactory
public class JDKProxyFactory implements InvocationHandler {private Object targetObject; //代理的目标对象public Object createProxyIntance(Object targetObject) {this.targetObject = targetObject; /** * 第一个参数设置代码使用的类装载器,一般采用跟目标类相同的类装载器 * 第二个参数设置代理类实现的接口 * 第三个参数设置回调对象,当代理对象的方法被调用时,会委派给该参数指定对象的invoke方法 */return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(), this.targetObject.getClass().getInterfaces(), this);}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {PersonServiceImpl ps = (PersonServiceImpl) this.targetObject;Object result = null;if (ps.getUser() != null) { // 如果user为null, 则无法调用目标方法result = method.invoke(targetObject, args); // 把方法调用委派给目标对象}return result;}}
④ 测试一把:
public class PersonServiceImplTest {@Testpublic void testJDKProxy() {JDKProxyFactory factory = new JDKProxyFactory();PersonService personService = (PersonService) factory.createProxyIntance(new PersonServiceImpl("zhangsan"));personService.save();}}
[ CGLIB生成代理 ]
Cglib是一个优秀的动态代理框架,它的底层使用ASM在内存中动态的生成被代理类的子类。
使用CGLIB生成代理需要引入cglib-nodep-2.1_3.jar
① CBLIG生成代理工厂: CGlibProxyFactory
public class CGlibProxyFactory implements MethodInterceptor {private Object targetObject;public Object createProxyIntance(Object targetObject) {this.targetObject = targetObject;Enhancer enhancer = new Enhancer();enhancer.setSuperclass(this.targetObject.getClass()); // 设置代理类的父类enhancer.setCallback(this); // 设置回调函数return enhancer.create();}public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {PersonServiceImpl bean = (PersonServiceImpl) this.targetObject;Object result = null;if (bean.getUser() != null) { // 如果user为null, 则无法调用目标方法result = methodProxy.invoke(targetObject, args);}return result;}}
② 测试一把
public class PersonServiceImplTest {@Testpublic void testCGLIBProxy() {CGlibProxyFactory factory = new CGlibProxyFactory();PersonService personService = (PersonServiceImpl) factory.createProxyIntance(new PersonServiceImpl("lisi"));personService.save();}}
[ 比较两种代理 ]
1. 使用JDK的动态代理, 被代理类一定要实现了某个接口, 而使用CGLIB, 被代理类没有实现任何接口也可以实现动态代理功能,
2. 因为采用的是继承, 所以cglib无法对使用final修饰的类使用代理.
3. CGLIB的速度要远远快于JDK Proxy动态代理.
0 0
- 深入探索spring技术内幕(六): JDK动态代理和cglib生成代理
- 深入探索spring技术内幕(六): JDK动态代理和cglib生成代理
- Spring---->JDK动态代理和CGLIB字节码生成
- 简单模拟Spring AOP功能 (2) JDK动态代理技术和CGLib的动态代理
- 动态代理(jdk)+cglib技术
- 基于Spring AOP的JDK动态代理和CGLIB代理
- JDK动态代理和CGLIB动态代理
- JDK动态代理和CGLIB动态代理
- JDK动态代理和Cglib动态代理
- Cglib动态代理和jdk动态代理
- jdk动态代理和CGlib动态代理
- jdk动态代理和cglib动态代理
- 动态代理(JDK和CGLIB)
- JDK动态代理和CGLIB
- jdk和cglib动态代理
- JDK和Cglib动态代理
- JDK动态代理和CGLIB代理
- jdk动态代理和cglib强制代理
- cygwin的入门
- 常用的正则表达式大全
- bat脚本命令
- PHP Apache shutdown unexpectedly启动错误解释及解决办法
- ny吝啬的国王
- 深入探索spring技术内幕(六): JDK动态代理和cglib生成代理
- Android UI开发神兵利器之Angrytools
- MapReduce: 提高MapReduce性能的七点建议
- 笔记--cocos2d-x 3.0 环境搭建
- poj2299
- C++ 常函数
- JSP_a sample jsp
- leetcode第一刷_Length of Last Word
- MapReduce:默认Counter的含义