- 浏览: 585386 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
lihaiming:
受用了,已把定义的版本改为跟本地的一致,不用担心找不到了,现应 ...
Cannot find the declaration of element 'beans' -
Albert_Hawking:
看到这个帖子,解决了我的问题。 我的总结是这样的:由于mave ...
Cannot find the declaration of element 'beans' -
di1984HIT:
学习了啊,哈哈哈~~
win7下安装的sqlserver ,1433端口不通 -
蛋呢823:
我也碰到这个问题,尝试了你这个方法也不行,自己摸索了一天,终于 ...
was缓存导致web.xml更改无效 -
liuxiyangyang:
文章帮了我大忙了,谢谢
Cannot find the declaration of element 'beans'
转自 http://llying.iteye.com/blog/220452
CGlib是什么?
CGlib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。
当然这些实际的功能是asm所提供的,asm又是什么?Java字节码操控框架,具体是什么大家可以上网查一查,毕竟我们这里所要讨论的是cglib,
cglib就是封装了asm,简化了asm的操作,实现了在运行期动态生成新的class。
可能大家还感觉不到它的强大,现在就告诉你。
实际上CGlib为spring aop提供了底层的一种实现;为hibernate使用cglib动态生成VO/PO (接口层对象)。
下面我们将通过一个具体的事例来看一下CGlib体验一下CGlib。
* CGlib 2.13
* ASM 2.23
以一个实例在简单介绍下cglib的应用。
我们模拟一个虚拟的场景,模拟对表的操作。
1. 开始我们对表提供了CRUD方法。
我们现在创建一个对Table操作的DAO类。
- public class TableDAO {
- public void create(){
- System.out.println("create() is running !");
- }
- public void query(){
- System.out.println("query() is running !");
- }
- public void update(){
- System.out.println("update() is running !");
- }
- public void delete(){
- System.out.println("delete() is running !");
- }
- }
OK,它就是一个javaBean,提供了CRUD方法的javaBean。
下面我们创建一个DAO工厂,用来生成DAO实例。
- public class TableDAOFactory {
- private static TableDAO tDao = new TableDAO();
- public static TableDAO getInstance(){
- return tDao;
- }
- }
接下来我们创建客户端,用来调用CRUD方法。
- public class Client {
- public static void main(String[] args) {
- TableDAO tableDao = TableDAOFactory.getInstance();
- doMethod(tableDao);
- }
- public static void doMethod(TableDAO dao){
- dao.create();
- dao.query();
- dao.update();
- dao.delete();
- }
- }
OK,完成了,CRUD方法完全被调用了。当然这里并没有CGlib的任何内容。问题不会这么简单的就结束,新的需求来临了。
2. 变化随之而来,Boss告诉我们这些方法不能开放给用户,只有“张三”才有权使用。阿~!怎么办,难道我们要在每个方法上面进行判断吗?
好像这么做也太那啥了吧,对了对了Proxy可能是最好的解决办法。jdk的代理就可以解决了。 好了我们来动手改造吧。等等jdk的代理需要实现接口,这样,
我们的dao类需要改变了。既然不想改动dao又要使用代理,我们这就请出CGlib。
我们只需新增一个权限验证的方法拦截器。
- public class AuthProxy implements MethodInterceptor {
- private String name ;
- //传入用户名称
- public AuthProxy(String name){
- this.name = name;
- }
- public Object intercept(Object arg0, Method arg1, Object[] arg2,
- MethodProxy arg3) throws Throwable {
- //用户进行判断
- if(!"张三".equals(name)){
- System.out.println("你没有权限!");
- return null;
- }
- return arg3.invokeSuper(arg0, arg2);
- }
- }
当然不能忘了对我们的dao工厂进行修改,我们提供一个使用代理的实例生成方法
- public static TableDAO getAuthInstance(AuthProxy authProxy){
- Enhancer en = new Enhancer();
- //进行代理
- en.setSuperclass(TableDAO.class);
- en.setCallback(authProxy);
- //生成代理实例
- return (TableDAO)en.create();
- }
我们这就可以看看客户端的实现了。添加了两个方法用来验证不同用户的权限。
- public static void haveAuth(){
- TableDAO tDao = TableDAOFactory.getAuthInstance(new AuthProxy("张三"));
- doMethod(tDao);
- }
- public static void haveNoAuth(){
- TableDAO tDao = TableDAOFactory.getAuthInstance(new AuthProxy("李四"));
- doMethod(tDao);
- }
OK,"张三"的正常执行,"李四"的没有执行。
看到了吗?简单的aop就这样实现了
难道就这样结束了么?
3. Boss又来训话了,不行不行,现在除了"张三"其他人都用不了了,现在不可以这样。他们都来向我反映了,必须使用开放查询功能。
哈哈,现在可难不倒我们了,因为我们使用了CGlib。当然最简单的方式是去修改我们的方法拦截器,不过这样会使逻辑变得复杂,且
不利于维护。还好CGlib给我们提供了方法过滤器(CallbackFilter),CallbackFilte可以明确表明,被代理的类中不同的方法,
被哪个拦截器所拦截。下面我们就来做个过滤器用来过滤query方法。
- public class AuthProxyFilter implements CallbackFilter{
- public int accept(Method arg0) {
- if(!"query".equalsIgnoreCase(arg0.getName()))
- return 0;
- return 1;
- }
- }
OK,可能大家会对return 0 or 1感到困惑,用到的时候就会讲解,当然下面就会用到了。
我们在工场中新增一个使用了过滤器的实例生成方法。
- public static TableDAO getAuthInstanceByFilter(AuthProxy authProxy){
- Enhancer en = new Enhancer();
- en.setSuperclass(TableDAO.class);
- en.setCallbacks(new Callback[]{authProxy,NoOp.INSTANCE});
- en.setCallbackFilter(new AuthProxyFilter());
- return (TableDAO)en.create();
- }
看到了吗setCallbacks中定义了所使用的拦截器,其中NoOp.INSTANCE是CGlib所提供的实际是一个没有任何操作的拦截器,
他们是有序的。一定要和CallbackFilter里面的顺序一致。明白了吗?上面return返回的就是返回的顺序。也就是说如果调用query方法就使用NoOp.INSTANCE进行拦截。
现在看一下客户端代码。
- public static void haveAuthByFilter(){
- TableDAO tDao = TableDAOFactory.getAuthInstanceByFilter(new AuthProxy("张三"));
- doMethod(tDao);
- tDao = TableDAOFactory.getAuthInstanceByFilter(new AuthProxy("李四"));
- doMethod(tDao);
- }
ok,现在"李四"也可以使用query方法了,其他方法仍然没有权限。
哈哈,当然这个代理的实现没有任何侵入性,无需强制让dao去实现接口。
发表评论
-
使用json-lib进行Java和JSON之间的转换
2013-05-09 09:30 1129http://www.cnblogs.com/mailing ... -
java验证身份证号码及编码规则和提取相应信息
2012-09-21 16:39 1817转自:http://www.cnblogs.com ... -
判断二个RGB颜色相近
2012-08-27 12:04 8982转自:http://blog.sina.com.cn/s ... -
Java中颜色的String和Color对象之间的互相转换
2012-06-27 09:10 2588转自http://blog.csdn.net/signs ... -
字符编码详解——彻底理解掌握编码知识,“乱码”不复存在
2012-06-04 16:07 1441摘自 <http://polaris1119.iteye ... -
Java编程中“为了性能”尽量要做到的一些地方
2012-04-26 15:28 799http://www.iteye.com/magazines/ ... -
POI 汇总、总结帖
2012-01-17 17:21 1957最近工作需求使用POI,使用场景如下: 1、查询数据库获取数 ... -
POI实现插入行
2012-01-17 17:13 15277http://hi.baidu.com/xiangliling ... -
POI操作Excel文档-中级篇
2012-01-17 17:12 1293转自 http://ltc603.iteye.com/blo ... -
POI操作Excel文档-基础篇
2012-01-17 17:09 1100转自:http://ltc603.iteye.com/blog ... -
制作完整的java可执行文件
2012-01-09 10:56 1013转自:http://www.cnblogs.com/Seiya ... -
Step By Step(Java 系列的目录)
2012-01-09 10:10 783转自:http://www.cnblogs.com/steph ... -
引用weblogic10的weblogic.jar
2011-12-27 11:35 2889weblogic10及以后的版本,不能直接使用server/l ... -
SWING 那几刀
2011-12-25 01:29 1971最近想做一些桌面程序,所以把前段时间ITEYE上很多的Swin ... -
遍历Map时抛出java.util.ConcurrentModificationException异常的解决办法
2011-12-22 15:46 3032转自http://hi.baidu.com/notyetfis ... -
Crack JRebel 4.0,无需重启JVM,热部署解决方案
2011-12-02 15:44 1455http://dl.dropbox.com/u/2295134 ... -
log4j详解与实战
2011-11-01 15:45 1178转自:http://www.iteye.com/t ... -
【解惑】深入jar包:从jar包中读取资源文件
2011-07-17 12:36 1174我们常常在代码中读取一些资源文件(比如图片,音乐,文 ... -
sun.misc.BASE64Encoder与sun.misc.BASE64Decoder导入错误
2011-07-14 21:24 12220项目中引用import sun.misc.BASE64Deco ... -
分享高效java开发者必备的资源列表
2011-07-14 09:11 1251分享高效java开发者必备 ...
相关推荐
在打造无入侵的类代理中,CGlib的优越性体现在: 1. **无需修改原始代码**:因为CGlib是基于字节码操作,所以我们无需修改目标类的源代码,就能实现对它的代理,这在保持原有代码结构不变的情况下提供了很大的灵活...
开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4...
赠送jar包:cglib-nodep-3.2.4.jar; 赠送原API文档:cglib-nodep-3.2.4-javadoc.jar; 赠送源代码:cglib-nodep-3.2.4-sources.jar; 赠送Maven依赖信息文件:cglib-nodep-3.2.4.pom; 包含翻译后的API文档:cglib-...
CGLIB-nodep-2.2.jar包含了CGLIB的所有核心类和接口,如Enhancer、MethodInterceptor等,用于实现动态代理和类的增强。 CGLIB的使用主要集中在以下几个方面: 1. **动态代理**:在Java中,如果我们想要在调用某个...
总的来说,`spring-cglib-repack-3.2.0.jar`和`spring-objenesis-repack-2.1.jar`是Spring框架正常运行的关键组成部分,它们分别负责动态子类生成和无参构造函数对象的快速实例化,对于理解和优化Spring应用的性能有...
在这里,我们有两个版本,即cglib-full-2.0和cglib-full-2.0.2。通常,更新的版本修复了旧版本中的bug,可能提供了新的特性和性能优化。从2.0到2.0.2,可能会包含一些稳定性改进和兼容性调整。 5. **使用步骤** -...
在深入理解`spring-cglib-repack-3.2.4.jar`和`spring-objenesis-repack-2.5.1.jar`这两个jar包之前,我们先来了解一下Spring框架的核心概念。 Spring框架的核心包括依赖注入(Dependency Injection,DI)和面向切...
"spring-cglib-repack-3.2.5.jar"、"spring-objenesis-repack-2.6.jar"和"spring-objenesis-repack-2.5.1.jar"这三个文件是Spring源码阅读环境中常用的依赖包,它们各自承担着不同的功能。 首先,我们来看"CGLIB"...
`cglib-nodep-2.2.jar` 和 `cglib-2.2.0.jar` 是CGLib的两个不同版本。`nodep` 在这里表示 "no dependencies",即无依赖版,意味着这个版本的CGLib不包含对其他库的依赖,开发者需要自行引入必要的依赖。而`cglib-...
cglib-nodep-2.2.3.jar cglig 库文件
赠送jar包:cglib-nodep-3.1.jar; 赠送原API文档:cglib-nodep-3.1-javadoc.jar; 赠送源代码:cglib-nodep-3.1-sources.jar; 赠送Maven依赖信息文件:cglib-nodep-3.1.pom; 包含翻译后的API文档:cglib-nodep-...
JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源...
总的来说,`spring-cglib-repack-3.2.6.jar` 和 `spring-objenesis-repack-2.6.jar`是Spring框架的核心组成部分,它们提供了代理和对象实例化的底层支持。在进行Spring源码学习或开发时,确保这两个库的正确引入是至...
赠送jar包:cglib-nodep-3.1.jar; 赠送原API文档:cglib-nodep-3.1-javadoc.jar; 赠送源代码:cglib-nodep-3.1-sources.jar; 赠送Maven依赖信息文件:cglib-nodep-3.1.pom; 包含翻译后的API文档:cglib-nodep-...
cglib-full-2.0.2.jar cglib-full-2.0.2.jar cglib-full-2.0.2.jar
在提供的文件中,我们看到了两个与Spring相关的库:`spring-cglib-repack-3.2.6.jar` 和 `spring-objenesis-repack-2.6.jar`。这两个库都是Spring框架的重要组成部分,用于解决特定的编程问题。 首先,让我们来了解...
CGlib-nodep-2.1_3.jar 是一个与Java编程相关的库,主要用来扩展Java反射功能,特别是在处理面向切面编程(AOP)时。它是一个无依赖(nodep)版本,意味着它包含了所有必需的类,无需额外导入其他库,如ASM库。这个...
标题中的"spring-cglib-repack-3.2.5.jar"和"spring-objenesis-repack-2.6.jar"是两个与Spring框架相关的库文件,它们主要用于Spring框架的内部实现,尤其是针对Java对象的创建和代理机制。下面将详细解释这两个库的...
首先,"spring-cglib-repack-3.1.jar"是一个针对CGLIB(Code Generation Library)的打包版本,用于在运行时动态创建Java类的子类。CGLIB是一个强大的代码生成库,常被用作Java代理机制,尤其在Spring AOP(面向切面...
总的来说,"hibernate-cglib-repack-2.1_3.jar"是Hibernate框架中不可或缺的一部分,它通过CGLIB库实现了对Java类的动态代理,提供了诸如懒加载、拦截器等高级功能,极大地增强了ORM的灵活性和可扩展性。在实际开发...