首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

jdk动态署理和CGlib动态代理

2012-11-15 
jdk动态代理和CGlib动态代理package com.test.cglibimport net.sf.cglib.proxy.Enhancerpublic class Te

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去实现接口

热点排行