jdk动态代理和CGlib动态代理
package com.test.cglib;import net.sf.cglib.proxy.Enhancer;public class Test {public static void main(String rags[]){ //Target target = new Target(); Test test = new Test(); Target proxyTarget = (Target)test.createProxy(Target.class); String res=proxyTarget.execute(); System.out.println("result:"+res); } public Object createProxy(Class targetClass){ Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(targetClass); enhancer.setCallback(new MyMethodInterceptor()); return enhancer.create(); } }?
三,以一个实例在简单介绍下cglib的应用 ,我们模拟一个虚拟的场景,模拟对表的操作(代码参见附件dynamicProxyDemo.rar)
1. 开始我们对表提供了CRUD方法,TableDAO.java
2.创建一个DAO工厂,用来生成DAO实例,TableDAOFactory.java
3.创建客户端,用来调用CRUD方法,Client.java
OK,完成了,CRUD方法完全被调用了。
当然这里并没有CGlib的任何内容。
问题不会这么简单的就结束,新的需求来临了
=====================================================================
Boss告诉我们这些方法不能开放给用户,只有“张三”才有权使用。
怎么办,难道我们要在每个方法上面进行判断吗
对了对了Proxy可能是最好的解决办法。jdk的代理就可以解决了。 好了我们来动手改造吧。等等jdk的代理需要实现接口
我们的dao类需要改变了。既然不想改动dao又要使用代理,我们这就请出CGlib
1.只需新增一个权限验证的方法拦截器,AuthProxy.java
2.对我们的dao工厂进行修改,我们提供一个使用代理的实例生成方法,getAuthInstance()
3.客户端添加了两个方法用来验证不同用户的权限,haveAuth(),haveNoAuth()
OK,"张三"的正常执行,"李四"的没有执行。?
看到了吗?简单的aop就这样实现了
=====================================================================
?Boss又来训话了,不行不行,
?现在除了"张三"其他人都用不了了,现在不可以这样。他们都来向我反映了,必须使用开放查询功能
CGlib给我们提供了方法过滤器(CallbackFilter)
CallbackFilter可以明确表明,被代理的类中不同的方法, 被哪个拦截器所拦截
1.下面我们就来做个过滤器用来过滤query方法,AuthProxyFilter.java
2.在工场中新增一个使用了过滤器的实例生成方法,getAuthInstanceByFilter()
3.客户端添加了个方法用来验证过滤器,haveAuthByFilter()
?
setCallbacks中定义了所使用的拦截器,
其中NoOp.INSTANCE是CGlib所提供的实际是一个没有任何操作的拦截器,?
他们是有序的。一定要和CallbackFilter里面的顺序一致。
上面return返回的就是返回的顺序。也就是说如果调用query方法就使用NoOp.INSTANCE进行拦截
?
?
ok,现在"李四"也可以使用query方法了,其他方法仍然没有权限。?
哈哈,当然这个代理的实现没有任何侵入性,无需强制让dao去实现接口