- 浏览: 3445708 次
- 性别:
- 来自: 珠海
-
文章分类
- 全部博客 (1633)
- Java (250)
- Android&HTML5 (111)
- Struts (10)
- Spring (236)
- Hibernate&MyBatis (115)
- SSH (49)
- jQuery插件收集 (55)
- Javascript (145)
- PHP (77)
- REST&WebService (18)
- BIRT (27)
- .NET (7)
- Database (105)
- 设计模式 (16)
- 自动化和测试 (19)
- Maven&Ant (43)
- 工作流 (36)
- 开源应用 (156)
- 其他 (16)
- 前台&美工 (119)
- 工作积累 (0)
- OS&Docker (83)
- Python&爬虫 (28)
- 工具软件 (157)
- 问题收集 (61)
- OFbiz (6)
- noSQL (12)
最新评论
-
HEZR曾嶸:
你好博主,这个不是很理解,能解释一下嘛//左边+1,上边+1, ...
java 两字符串相似度计算算法 -
天使建站:
写得不错,可以看这里,和这里的这篇文章一起看,有 ...
jquery 遍历对象、数组、集合 -
xue88ming:
很有用,谢谢
@PathVariable映射出现错误: Name for argument type -
jnjeC:
厉害,困扰了我很久
MyBatis排序时使用order by 动态参数时需要注意,用$而不是# -
TopLongMan:
非常好,很实用啊。。
PostgreSQL递归查询实现树状结构查询
http://www.cnblogs.com/icejoywoo/archive/2011/06/05/2072970.html
1.Enhancer 中有几个常用的方法, setSuperClass和setCallback, 设置好了SuperClass后, 可以使用create制作代理对象.
2.CallbackFilter 可以实现不同的方法使用不同的回调方法, CallbackFilter中的accept方法, 根据不同的method返回不同的值i, 这个值是在callbacks中的顺序, 就是调用了callbacks[i].
3.Mixin 这是一种将多个接口混合在一起的方式, 实现了多个接口.这种方式是一种多继承的替代方案, 很大程度上解决了多继承的很多问题, 实现和理解起来都比较容易.
4.BeanCopier 用来对象之间拷贝属性.
http://www.blogjava.net/stone2083/archive/2008/03/16/186615.html
CGlib概述:
cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。
cglib封装了asm,可以在运行期动态生成新的class。
cglib用于AOP,jdk中的proxy必须基于接口,cglib却没有这个限制。
CGlib应用:
以一个实例在简单介绍下cglib的应用。
我们模拟一个虚拟的场景,关于信息的管理。
1)原始需求是任何人可以操作信息的create,update,delete,query操作。
InfoManager.java--封装对信息的操作
InfoManagerFactory.java--工厂类
client.java--供客户端调用
至此,没有涉及到cglib的内容,因为需求太简单了,但是接下来,需求发生了改变,要求:
2)只有一个叫“maurice”的用户登录,才允许对信息进行create,update,delete,query的操作。
怎么办?难道在每个方法前,都加上一个权限判断吗?这样重复逻辑太多了,于是乎想到了Proxy(代理模式),但是原先的InfoManager也没有实现接口,不能采用jdk的proxy。那么cglib在这边就要隆重登场。
一旦使用cgblig,只需要添加一个MethodInterceptor的类以及修改factory代码就可以实现这个需求。
AuthProxy.java--权限校验代理类
InfoManagerFactory.java--代码变动如下:
client.java--代码修改如下
执行下代码,发现这时client端中已经加上了权限校验。
同样是InfoManager,为什么这时能多了权限的判断呢?Factory中enhancer.create()返回的到底是什么对象呢?这个疑问将在第三部分CGlib中解释。
这边的代码,其实是介绍了cglib中的enhancer功能.
到这里,参照上面的代码,就可以使用cglib带来的aop功能了。但是为了更多介绍下cglib的功能,模拟需求再次发生变化:
3)由于query功能用户maurice才能使用,招来其他用户的强烈的抱怨,所以权限再次变更,只有create,update,delete,才需要权限保护,query任何人都可以使用。
怎么办?采用AuthProxy,使得InfoManager中的所有方法都被代理,加上了权限的判断。当然,最容易想到的办法,就是在AuthProxy的intercept的方法中再做下判断,如果代理的method是query,不需要权限验证。这么做,可以,但是一旦逻辑比较复杂的时候,intercept这个方法要做的事情会很多,逻辑会异常的复杂。
幸好,cglib还提供了CallbackFilter。使用CallbackFilter,可以明确表明,被代理的类(InfoManager)中不同的方法,被哪个拦截器(interceptor)拦截。
AuthProxyFilter.java
这段代码什么意思?其中的accept方法的意思是说,如果代理的方法是query(),那么使用第二个拦截器去拦截,如果代理的方法不是query(),那么使用第一个拦截器去拦截。所以我们只要再写一个拦截器,不做权限校验就行了。(其实,cglib中的NoOp.INSTANCE就是一个空的拦截器,只要配置上这个就可以了。)
InfoManagerFactory.java--代码修改如下:(配置不同的拦截器和filter)
记住:setCallbacks中的拦截器(interceptor)的顺序,一定要和CallbackFilter里面指定的顺序一致!!切忌。
Client.java
此时,对于query的权限校验已经被去掉了。
通过一个模拟需求,简单介绍了cglib aop功能的使用。
CGlib应用非常广,在spring,hibernate等框架中,被大量的使用。
1.Enhancer 中有几个常用的方法, setSuperClass和setCallback, 设置好了SuperClass后, 可以使用create制作代理对象.
2.CallbackFilter 可以实现不同的方法使用不同的回调方法, CallbackFilter中的accept方法, 根据不同的method返回不同的值i, 这个值是在callbacks中的顺序, 就是调用了callbacks[i].
3.Mixin 这是一种将多个接口混合在一起的方式, 实现了多个接口.这种方式是一种多继承的替代方案, 很大程度上解决了多继承的很多问题, 实现和理解起来都比较容易.
4.BeanCopier 用来对象之间拷贝属性.
http://www.blogjava.net/stone2083/archive/2008/03/16/186615.html
CGlib概述:
cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。
cglib封装了asm,可以在运行期动态生成新的class。
cglib用于AOP,jdk中的proxy必须基于接口,cglib却没有这个限制。
CGlib应用:
以一个实例在简单介绍下cglib的应用。
我们模拟一个虚拟的场景,关于信息的管理。
1)原始需求是任何人可以操作信息的create,update,delete,query操作。
InfoManager.java--封装对信息的操作
public class InfoManager { // 模拟查询操作 public void query() { System.out.println("query"); } // 模拟创建操作 public void create() { System.out.println("create"); } // 模拟更新操作 public void update() { System.out.println("update"); } // 模拟删除操作 public void delete() { System.out.println("delete"); } }
InfoManagerFactory.java--工厂类
public class InfoManagerFactory { private static InfoManager manger = new InfoManager(); /** * 创建原始的InfoManager * * @return */ public static InfoManager getInstance() { return manger; } }
client.java--供客户端调用
public class Client { public static void main(String[] args) { Client c = new Client(); c.anyonecanManager(); } /** * 模拟:没有任何权限要求,任何人都可以操作 */ public void anyonecanManager() { System.out.println("any one can do manager"); InfoManager manager = InfoManagerFactory.getInstance(); doCRUD(manager); separatorLine(); } /** * 对Info做增加/更新/删除/查询操作 * * @param manager */ private void doCRUD(InfoManager manager) { manager.create(); manager.update(); manager.delete(); manager.query(); } /** * 加一个分隔行,用于区分 */ private void separatorLine() { System.out.println("################################"); } }
至此,没有涉及到cglib的内容,因为需求太简单了,但是接下来,需求发生了改变,要求:
2)只有一个叫“maurice”的用户登录,才允许对信息进行create,update,delete,query的操作。
怎么办?难道在每个方法前,都加上一个权限判断吗?这样重复逻辑太多了,于是乎想到了Proxy(代理模式),但是原先的InfoManager也没有实现接口,不能采用jdk的proxy。那么cglib在这边就要隆重登场。
一旦使用cgblig,只需要添加一个MethodInterceptor的类以及修改factory代码就可以实现这个需求。
AuthProxy.java--权限校验代理类
public class AuthProxy implements MethodInterceptor { private String name; // 会员登录名 public AuthProxy(String name) { this.name = name; } /** * 权限校验,如果会员名为:maurice,则有权限做操作,否则提示没有权限 */ @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { if (!"maurice".equals(this.name)) { System.out.println("AuthProxy:you have no permits to do manager!"); return null; } return proxy.invokeSuper(obj, args); } public String getName() { return name; } public void setName(String name) { this.name = name; } }
InfoManagerFactory.java--代码变动如下:
public class InfoManagerFactory { /** * 创建带有权限检验的InfoManager * * @param auth * @return */ public static InfoManager getAuthInstance(AuthProxy auth) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(InfoManager.class); enhancer.setCallback(auth); return (InfoManager) enhancer.create(); } }
client.java--代码修改如下
public class Client { public static void main(String[] args) { Client c = new Client(); c.haveNoAuthManager(); c.haveAuthManager(); } /** * 模拟:登录会员没有权限 */ public void haveNoAuthManager() { System.out.println("the loginer's name is not maurice,so have no permits do manager"); InfoManager noAuthManager = InfoManagerFactory.getAuthInstance(new AuthProxy("maurice1")); doCRUD(noAuthManager); separatorLine(); } /** * 模拟:登录会员有权限 */ public void haveAuthManager() { System.out.println("the loginer's name is maurice,so have permits do manager"); InfoManager authManager = InfoManagerFactory.getAuthInstance(new AuthProxy("maurice")); doCRUD(authManager); separatorLine(); } /** * 对Info做增加/更新/删除/查询操作 * * @param manager */ private void doCRUD(InfoManager manager) { manager.create(); manager.update(); manager.delete(); manager.query(); } /** * 加一个分隔行,用于区分 */ private void separatorLine() { System.out.println("################################"); } }
执行下代码,发现这时client端中已经加上了权限校验。
同样是InfoManager,为什么这时能多了权限的判断呢?Factory中enhancer.create()返回的到底是什么对象呢?这个疑问将在第三部分CGlib中解释。
这边的代码,其实是介绍了cglib中的enhancer功能.
到这里,参照上面的代码,就可以使用cglib带来的aop功能了。但是为了更多介绍下cglib的功能,模拟需求再次发生变化:
3)由于query功能用户maurice才能使用,招来其他用户的强烈的抱怨,所以权限再次变更,只有create,update,delete,才需要权限保护,query任何人都可以使用。
怎么办?采用AuthProxy,使得InfoManager中的所有方法都被代理,加上了权限的判断。当然,最容易想到的办法,就是在AuthProxy的intercept的方法中再做下判断,如果代理的method是query,不需要权限验证。这么做,可以,但是一旦逻辑比较复杂的时候,intercept这个方法要做的事情会很多,逻辑会异常的复杂。
幸好,cglib还提供了CallbackFilter。使用CallbackFilter,可以明确表明,被代理的类(InfoManager)中不同的方法,被哪个拦截器(interceptor)拦截。
AuthProxyFilter.java
public class AuthProxyFilter implements CallbackFilter { private static final int AUTH_NEED = 0; private static final int AUTH_NOT_NEED = 1; /** * <pre> * 选择使用的proxy * 如果调用query函数,则使用第二个proxy * 否则,使用第一个proxy * </pre> */ @Override public int accept(Method method) { if ("query".equals(method.getName())) { return AUTH_NOT_NEED; } return AUTH_NEED; } }
这段代码什么意思?其中的accept方法的意思是说,如果代理的方法是query(),那么使用第二个拦截器去拦截,如果代理的方法不是query(),那么使用第一个拦截器去拦截。所以我们只要再写一个拦截器,不做权限校验就行了。(其实,cglib中的NoOp.INSTANCE就是一个空的拦截器,只要配置上这个就可以了。)
InfoManagerFactory.java--代码修改如下:(配置不同的拦截器和filter)
public class InfoManagerFactory { /** * 创建不同权限要求的InfoManager * * @param auth * @return */ public static InfoManager getSelectivityAuthInstance(AuthProxy auth) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(InfoManager.class); enhancer.setCallbacks(new Callback[] { auth, NoOp.INSTANCE }); enhancer.setCallbackFilter(new AuthProxyFilter()); return (InfoManager) enhancer.create(); } }
记住:setCallbacks中的拦截器(interceptor)的顺序,一定要和CallbackFilter里面指定的顺序一致!!切忌。
Client.java
public class Client { public static void main(String[] args) { Client c = new Client(); c.selectivityAuthManager(); } /** * 模拟:没有权限的会员,可以作查询操作 */ public void selectivityAuthManager() { System.out.println("the loginer's name is not maurice,so have no permits do manager except do query operator"); InfoManager authManager = InfoManagerFactory.getSelectivityAuthInstance(new AuthProxy("maurice1")); doCRUD(authManager); separatorLine(); } /** * 对Info做增加/更新/删除/查询操作 * * @param manager */ private void doCRUD(InfoManager manager) { manager.create(); manager.update(); manager.delete(); manager.query(); } /** * 加一个分隔行,用于区分 */ private void separatorLine() { System.out.println("################################"); } }
此时,对于query的权限校验已经被去掉了。
通过一个模拟需求,简单介绍了cglib aop功能的使用。
CGlib应用非常广,在spring,hibernate等框架中,被大量的使用。
发表评论
-
Java Comparable和Comparator
2016-06-26 08:52 720http://my.oschina.net/android52 ... -
Spring Boot 属性配置
2016-06-24 11:04 1200Spring Boot 属性配置和使用 http://blog ... -
Spring Boot 集成MyBatis
2016-06-24 10:55 2051Spring Boot 集成MyBatis http://bl ... -
Java集合框架之fastutil & koloboke
2016-06-23 14:04 2490Java集合框架之fastutil http://rensan ... -
Spring MVC防重复提交
2016-06-17 15:47 1664http://my.oschina.net/zyqjustin ... -
Spring容器加载完之后执行特定任务
2016-06-17 15:36 2309http://my.oschina.net/simpleton ... -
使用spring-session和shiro来代理session的配置
2016-06-16 11:21 12082使用spring-session和redis来代理sessio ... -
JSTL 的 if else : 有 c:if 没有 else 的处理
2016-06-14 09:52 1350http://blog.csdn.net/xiyuan1999 ... -
spring mvc 请求转发和重定向
2016-06-14 09:48 1423http://blog.csdn.net/jackpk/art ... -
ehcache 分布式支持
2016-06-05 22:26 1118原文 http://my.oschina.net/glenxu ... -
Intellij IDEA插件开发入门
2016-05-26 11:42 2907原文: http://blog.csdn.net/dc_726 ... -
阿里巴巴Druid数据源的配置与使用
2016-05-24 17:42 1563http://my.oschina.net/wjme/blog ... -
mvc:view-controller
2016-05-18 10:26 1101http://blog.csdn.net/lzwglory/a ... -
spring配置事物的方式:注解和aop配置
2016-05-14 00:26 4122参考: Spring AOP中pointcut express ... -
分布式任务调度组件 Uncode-Schedule
2016-05-13 14:47 2304http://www.oschina.net/p/uncode ... -
Mybatis分库分表扩展插件
2016-05-12 15:47 1641http://fangjialong.iteye.com/bl ... -
spring+mybatis+atomikos 实现JTA事务
2016-05-11 22:00 5546sping配置多个数据源 不同用户操作不同数据库 http:/ ... -
Spring中使用注解 @Scheduled执行定时任务
2016-05-10 09:39 1583原文:http://dwf07223.blog.51cto.c ... -
mysql中间件研究(Atlas,cobar,TDDL), 分库分表插件
2016-05-09 14:15 3480http://www.guokr.com/blog/47576 ... -
Java集合: Queue和Deque
2016-05-09 09:49 1880Queue http://my.oschina.net/kev ...
相关推荐
下面是一个简单的CGlib动态代理的示例: ```java import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method;...
下面将详细介绍CGLib的相关知识点。 1. **动态代理**: CGLib常用于为Java对象创建代理,以在方法调用前后添加额外的行为。比如,在Spring AOP框架中,CGLib被用来创建代理对象,实现在方法执行前后的拦截器逻辑,...
以上就是关于静态代理、动态代理(JDK)和CGlib代理的基本介绍。它们在Java开发中都有广泛的应用,尤其是在AOP(面向切面编程)和框架设计中,如Spring AOP就使用了这两种代理技术。了解并熟练掌握这些代理机制,...
通过这个库,开发者无需手动编写复杂的字节码,而是可以通过简单的API接口来创建新的类或者增强已有的类。这极大地提高了开发效率和代码的可读性,同时降低了出错的可能性。 【详细知识点】: 1. **字节码基础**:...
3. **cglib-nodep-2.1_3.jar**: CGLIB是一个代码生成库,主要用于创建代理对象,特别是在Spring AOP中,它可以动态生成子类来实现对目标类的方法拦截。 4. **commons-beanutils.jar**: 提供了访问JavaBeans组件属性...
这里我们以Druid为例,介绍其简单实现。 1. 添加依赖:在项目中引入Druid的Maven或Gradle依赖。例如,如果是Maven项目,可以在pom.xml中添加如下依赖: ```xml <groupId>com.alibaba</groupId> <artifactId>...
下面将详细介绍这两种动态代理机制。 1. JDK动态代理: JDK动态代理基于Java的接口实现。如果我们的目标对象实现了至少一个接口,那么Spring会为我们创建一个代理类,该类实现了相同的接口,并在调用接口方法时...
本示例将简要介绍如何在Spring应用中实现AOP,通过实际的代码示例帮助理解其工作原理。 首先,我们要理解AOP的核心概念。AOP是一种编程范式,它允许开发者定义“切面”(Aspects),这些切面封装了特定的关注点,如...
Commons Digester 提供了一个简单易用的框架来解析XML文档并映射到Java对象。对于需要处理XML数据的应用程序而言,它极大地简化了开发过程。 #### Commons Lang (commons-lang.jar) Commons Lang 是一个实用工具库...
本项目基于Hibernate3,将介绍如何实现最简单的查询功能,并且提供了必要的jar包以供使用。Hibernate3是Hibernate的第三个主要版本,它在性能和功能上都有所提升,同时也保持了与前一版本的良好兼容性。 首先,理解...
这里我们将深入探讨Java中的两种主要动态代理实现:JDK动态代理和CGLIB动态代理,以及静态代理作为基础概念的介绍。 首先,我们来看静态代理。静态代理是代理模式的一种实现方式,它要求我们为每个目标接口创建一个...
接着,“tiny-spring-step-2-abstract-beanfactory-and-do-bean-initilizing-in-it.zip”进一步深入,介绍了AbstractBeanFactory和Bean的初始化过程。在这个阶段,你将学习到BeanFactory如何解析XML配置,创建Bean...
有关于Spring,我们最常用的两个功能就是IOC和AOP,前几篇文章从源码级别介绍了Spring容器如何为我们生成bean及bean之间的依赖关系 下面我们接着来看AOP的源码实现。 有关于AOP,我们在面试中也被无数次问到...
下面将详细介绍这些资源包以及它们在Spring框架中的作用。 1. **asm-all-2.2.2.jar**: 这个jar包包含了ASM库的所有组件,ASM是一个Java字节码操控和分析框架,用于动态生成类或者增强已有类的功能。Spring框架在...
以上就是几个简单易懂的设计模式介绍,理解并熟练运用这些模式可以提升代码的可读性、可维护性和复用性。在实际开发中,根据项目需求和场景选择合适的设计模式,可以有效地提高软件的质量和效率。通过不断地学习和...
这三种代理模式各有其特点和应用场景,下面将详细介绍它们的工作原理和实现方式。 ### 静态代理 静态代理是最基础的代理形式,它通过创建一个代理类来间接调用目标对象的方法。在静态代理中,代理类和目标类通常...
【Spring AOP 详细介绍】 Spring AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的一个重要组成部分,它提供了在不修改源代码的情况下,对应用程序进行功能增强的能力。AOP的核心概念包括Advice...
- **简单易用**:集成到应用中非常简单,只需要添加相应的jar包,并进行简单的配置即可。 **3. jar包介绍** - **proxool-0.9.1.jar**:这是Proxool连接池的核心库,包含了所有必要的类和方法,用于创建、管理和维护...
- **统一jdk和cglib**:介绍Spring如何统一管理和使用JDK和CGLIB代理。 - **切点匹配**:讲解切点表达式的定义及匹配规则。 - **@Aspect与Advisor**:解释Spring AOP中的@Aspect注解和Advisor的作用。 - **静态通知*...