代理模式一般分为两种,即静态代理和动态代理,静态代理限制比较严格,代理类和委托类必须实现相同的接口;而动态代理则更加灵活,除了jdk的动态代理,其他的代理方式,如cglib和javassist则没有此限制。Hibernate框架加载用户信息时有用到cglib动态代理模式,只有在真正查询用户实体信息(如姓名)时,才去数据库查询;获取用户实体时,返回的其实是真实实体的一个子类代理而已。
静态代理
静态代理类图一般来讲,代理模式可以用在延迟加载,有效提升系统的启动速度。
动态代理
动态代理流程图JDK动态代理
jdk动态代理主要原理与静态代理基本一致,不过更加灵活,一般涉及到的核心接口或类为InvocationHandler
和Proxy
,使用方式及实现原理在参考1中有较为详细的解释。
特别是为什么代理类会执行方法时会调用处理分发器** InvocationHandler的invoke方法的分析特别到位。**
cglib动态代理
cglib动态代理,不用限制代理类和委托类实现相同的接口,它的基本使用在参考2中有详细的说明。
核心示例代码如下:
//cglib生成动态代理
Enhancer enhancer = new Enhancer();
enhancer.setCallback(new CgLibDBQueryInterceptor()); //指定切入器,一个实现MethodInterceptor接口的类
enhancer.setInterfaces(new Class[]{IDBQuery.class}); //指定实现的接口
//enhancer.setSuperclass();指定实现的父类
//生成代理类的实例(没有接口限制,此处只不过恰好是接口而已,如果是普通类,则代理类实质上是普通类的子类)
IDBQuery cglibProxy = (IDBQuery) enhancer.create(); //生成代理类实例
参考
1 Java JDK 动态代理(AOP)使用及实现原理分析
2 AOP的底层实现-CGLIB动态代理和JDK动态代理
3 Java动态代理机制详解
网友评论