- 浏览: 3431859 次
- 性别:
- 来自: 珠海
文章分类
- 全部博客 (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://blog.csdn.net/zdp072/article/details/25657995
[ JDK生成代理 ]
JDK中给我们提供了一个Proxy类可以动态的给我们生成代理.
假定我们要做一个权限管理系统, 需要控制用户对某一个方法的访问. 如果user为null, 那么不让用户访问save方法.
① 接口类: PersonService
② 实现类: PersonServiceImpl
③ 生成代理类工厂: JDKProxyFactory
④ 测试一把:
[ CGLIB生成代理 ]
Cglib是一个优秀的动态代理框架,它的底层使用ASM在内存中动态的生成被代理类的子类。
使用CGLIB生成代理需要引入cglib-nodep-2.1_3.jar
① CBLIG生成代理工厂: CGlibProxyFactory
② 测试一把
[ 比较两种代理 ]
1. 使用JDK的动态代理, 被代理类一定要实现了某个接口, 而使用CGLIB, 被代理类没有实现任何接口也可以实现动态代理功能,
2. 因为采用的是继承, 所以cglib无法对使用final修饰的类使用代理.
3. CGLIB的速度要远远快于JDK Proxy动态代理.
[ JDK生成代理 ]
JDK中给我们提供了一个Proxy类可以动态的给我们生成代理.
假定我们要做一个权限管理系统, 需要控制用户对某一个方法的访问. 如果user为null, 那么不让用户访问save方法.
① 接口类: PersonService
public interface PersonService { public void save(); }
② 实现类: PersonServiceImpl
public class PersonServiceImpl implements PersonService { private String user; public PersonServiceImpl(){ } public PersonServiceImpl(String user) { this.user = user; } public void save() { System.out.println("执行了save()方法"); } public String getUser() { return user; } }
③ 生成代理类工厂: JDKProxyFactory
public class JDKProxyFactory implements InvocationHandler { private Object targetObject; //代理的目标对象 public Object createProxyIntance(Object targetObject) { this.targetObject = targetObject; /** * 第一个参数设置代码使用的类装载器,一般采用跟目标类相同的类装载器 * 第二个参数设置代理类实现的接口 * 第三个参数设置回调对象,当代理对象的方法被调用时,会委派给该参数指定对象的invoke方法 */ return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(), this.targetObject.getClass().getInterfaces(), this); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { PersonServiceImpl ps = (PersonServiceImpl) this.targetObject; Object result = null; if (ps.getUser() != null) { // 如果user为null, 则无法调用目标方法 result = method.invoke(targetObject, args); // 把方法调用委派给目标对象 } return result; } }
④ 测试一把:
public class PersonServiceImplTest { @Test public void testJDKProxy() { JDKProxyFactory factory = new JDKProxyFactory(); PersonService personService = (PersonService) factory.createProxyIntance(new PersonServiceImpl("zhangsan")); personService.save(); } }
[ CGLIB生成代理 ]
Cglib是一个优秀的动态代理框架,它的底层使用ASM在内存中动态的生成被代理类的子类。
使用CGLIB生成代理需要引入cglib-nodep-2.1_3.jar
① CBLIG生成代理工厂: CGlibProxyFactory
public class CGlibProxyFactory implements MethodInterceptor { private Object targetObject; public Object createProxyIntance(Object targetObject) { this.targetObject = targetObject; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(this.targetObject.getClass()); // 设置代理类的父类 enhancer.setCallback(this); // 设置回调函数 return enhancer.create(); } public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { PersonServiceImpl bean = (PersonServiceImpl) this.targetObject; Object result = null; if (bean.getUser() != null) { // 如果user为null, 则无法调用目标方法 result = methodProxy.invoke(targetObject, args); } return result; } }
② 测试一把
public class PersonServiceImplTest { @Test public void testCGLIBProxy() { CGlibProxyFactory factory = new CGlibProxyFactory(); PersonService personService = (PersonServiceImpl) factory.createProxyIntance(new PersonServiceImpl("lisi")); personService.save(); } }
[ 比较两种代理 ]
1. 使用JDK的动态代理, 被代理类一定要实现了某个接口, 而使用CGLIB, 被代理类没有实现任何接口也可以实现动态代理功能,
2. 因为采用的是继承, 所以cglib无法对使用final修饰的类使用代理.
3. CGLIB的速度要远远快于JDK Proxy动态代理.
发表评论
-
Java Comparable和Comparator
2016-06-26 08:52 706http://my.oschina.net/android52 ... -
Spring Boot 属性配置
2016-06-24 11:04 1189Spring Boot 属性配置和使用 http://blog ... -
Spring Boot 集成MyBatis
2016-06-24 10:55 2035Spring Boot 集成MyBatis http://bl ... -
Java集合框架之fastutil & koloboke
2016-06-23 14:04 2480Java集合框架之fastutil http://rensan ... -
Spring MVC防重复提交
2016-06-17 15:47 1653http://my.oschina.net/zyqjustin ... -
Spring容器加载完之后执行特定任务
2016-06-17 15:36 2294http://my.oschina.net/simpleton ... -
使用spring-session和shiro来代理session的配置
2016-06-16 11:21 12067使用spring-session和redis来代理sessio ... -
JSTL 的 if else : 有 c:if 没有 else 的处理
2016-06-14 09:52 1343http://blog.csdn.net/xiyuan1999 ... -
spring mvc 请求转发和重定向
2016-06-14 09:48 1407http://blog.csdn.net/jackpk/art ... -
ehcache 分布式支持
2016-06-05 22:26 1104原文 http://my.oschina.net/glenxu ... -
Intellij IDEA插件开发入门
2016-05-26 11:42 2890原文: http://blog.csdn.net/dc_726 ... -
阿里巴巴Druid数据源的配置与使用
2016-05-24 17:42 1551http://my.oschina.net/wjme/blog ... -
mvc:view-controller
2016-05-18 10:26 1089http://blog.csdn.net/lzwglory/a ... -
spring配置事物的方式:注解和aop配置
2016-05-14 00:26 4113参考: Spring AOP中pointcut express ... -
分布式任务调度组件 Uncode-Schedule
2016-05-13 14:47 2293http://www.oschina.net/p/uncode ... -
Mybatis分库分表扩展插件
2016-05-12 15:47 1632http://fangjialong.iteye.com/bl ... -
spring+mybatis+atomikos 实现JTA事务
2016-05-11 22:00 5531sping配置多个数据源 不同用户操作不同数据库 http:/ ... -
Spring中使用注解 @Scheduled执行定时任务
2016-05-10 09:39 1574原文:http://dwf07223.blog.51cto.c ... -
mysql中间件研究(Atlas,cobar,TDDL), 分库分表插件
2016-05-09 14:15 3458http://www.guokr.com/blog/47576 ... -
Java集合: Queue和Deque
2016-05-09 09:49 1869Queue http://my.oschina.net/kev ...
相关推荐
在内存占用上,两者差别不大,但CGLIB生成的代理类可能略微增加内存负担。 在工具支持上,Spring框架对两者都有很好的支持。Spring AOP默认使用JDK动态代理,但如果目标类没有实现接口,它会自动切换到CGLIB。在...
本文将深入探讨两种主要的Java代理实现:JDK动态代理和CGLIB代理。 一、JDK动态代理 JDK动态代理基于接口实现,它要求被代理的类必须实现至少一个接口。在运行时,Java会动态地创建一个新的类,这个类实现了与原始...
如果我们想使用 JDK 动态代理,必须提供一个接口,并且将其实现类交给 JDK 动态代理来生成代理类。 CGLIB 动态代理是基于类的代理, 它可以代理类和接口。CGLIB 动态代理使用 ASM 字节码工具来生成代理类。CGLIB ...
JDK动态代理和CGLIB代理是两种常用的实现方式。 首先,我们来看看JDK动态代理。JDK动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类用于创建一个代理对象...
2. **Proxy类**:用于创建动态代理对象,通过`newProxyInstance()`静态方法,传入类加载器、接口数组和InvocationHandler实例来生成代理对象。 3. **实现过程**:首先,你需要定义一个接口,然后创建实现该接口的...
CGLib的优点是它可以代理任何类,无需目标对象实现接口,但相比JDK动态代理,它的运行效率较低,且由于生成了子类,可能会引起类加载和内存占用的问题。 **Spring AOP的应用**: 在Spring框架中,AOP主要用于日志...
JDK动态代理和CGlib动态代理是Java中实现这一目标的两种主要方式。 ### JDK动态代理 JDK动态代理基于Java的接口实现。如果一个类实现了至少一个接口,我们就可以为这个类创建一个动态代理。动态代理通过`java.lang....
- 创建代理对象:根据选择的代理方式(JDK或Cglib),调用相应的生成代理对象的方法。 - 定义目标方法:定义被代理类的方法,这可以是接口中的方法,对于Cglib,也可以是任意非final的方法。 - 实现`...
JDK动态代理的示例可能包括创建一个代理工厂,生成代理对象并实现InvocationHandler。CGLIB示例可能涉及使用Enhancer类来生成代理对象。对于拦截器,可能会展示如何定义和注册拦截器,以及如何构建拦截器链。此外,...
本篇将深入探讨两种主要的Java动态代理技术:JDK动态代理和CGLIB。 首先,我们来了解一下JDK动态代理。JDK动态代理基于Java反射API实现,主要用于接口代理。以下是一个简单的JDK动态代理的使用步骤: 1. **定义...
JDK 动态代理是 Java 中的一种动态代理方式,使用 Java 反射机制来生成代理类。JDK 动态代理的优点是可以在运行时生成代理类,无需编写代理类代码。 四、 CGLIB 动态代理 CGLIB 动态代理是另外一种动态代理方式,...
CGLIB使用ASM库生成代理类的字节码并加载到内存中。当原始类没有接口时,CGLIB比JDK动态代理更适用。 ```java // 引入CGLIB依赖 <groupId>cglib <artifactId>cglib <version>3.3.0 // 使用CGLIB创建代理 ...
Java提供了两种主要的动态代理实现方式:JDK动态代理和CGLIB动态代理。 **JDK动态代理**: JDK动态代理基于接口实现,也就是说,被代理的对象必须实现至少一个接口。代理机制的核心是`java.lang.reflect.Proxy`类和...
JDK动态代理只能为实现了至少一个接口的类生成代理。它的基本原理是利用反射机制生成一个实现了目标接口的子类,然后通过这个子类来调用原对象的方法。因此,如果目标类没有实现任何接口,JDK动态代理就无法工作。 ...
Cglib 动态代理的实现方式是:我们首先需要定义一个类,然后使用 Cglib 库来生成该类的代理对象,该代理对象将拦截对被代理对象的所有方法调用,并控制对被代理对象的访问。 Cglib 动态代理的优点是:它的实现方式...
JDK代理和Cglib代理是两种常用的动态代理实现方式。 **JDK代理(Java Dynamic Proxy)** JDK动态代理是Java标准库提供的一种代理机制,位于`java.lang.reflect`包下的`Proxy`类和`InvocationHandler`接口。JDK代理...
- target/classes:编译后的class文件,包括目标类的class文件,以及由CGLib生成的子类class文件 - 测试代码:展示如何使用Enhancer创建代理对象并调用方法 这两个项目可以帮助我们深入了解JDK和CGLib动态代理的...
1. **Enhancer类**:CGLIB的核心类,用于配置和生成代理对象。你可以设置回调方法、过滤器等,然后通过`enhance()`方法生成代理对象。 2. **MethodInterceptor接口**:类似于JDK的`InvocationHandler`,`...
2. **过程**:CGLIB使用`Enhancer`类作为入口,通过设置回调函数(Callback)和目标对象,生成代理子类。回调函数通常是一个实现了`MethodInterceptor`接口的对象,它在拦截方法调用时执行自定义逻辑。 3. **优点**...