在上片文章里说了如何用jdk自带的类Proxy来实现代理,但是在使用Proxy时要注意:目录类必须实现接口,如果目标类没有实现接口的话,可以用cglib.jar类实现代理。
1、首先从网上找到cglib进行下载,我这里用的是cglib-nodep-2.1_3.jar
2、新建java项目 CGLIBAop
2、在项目中创建程的Person.java
package cn.ehoo.bean;
/**
* @author whp
* @Email whp@ehoo.cn
* @Jan 4, 2011
*
*/
public class Person {
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2、创建目标类PersonServiceBean.java
PersonServiceBean.java
package cn.ehoo.service.impl;
import cn.ehoo.bean.Person;
/**
*@author whp
*@Email whp@ehoo.cn
*@Jan 4, 2011
*
*/
public class PersonserviceBean {
private String user;
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public PersonserviceBean() {
super();
}
public PersonserviceBean(String user) {
super();
this.user = user;
}
public void save(Person person){
System.out.println("执行PerServiceBean的save方法");
}
}
3、创建代理类
package cn.ehoo.aop;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import cn.ehoo.service.impl.PersonserviceBean;
/**
* @author whp
* @Email whp@ehoo.cn
* @Jan 4, 2011
*
*
*/
public class CGLIBFactory implements MethodInterceptor {
Object targetObject;// 目标对象
public Object createCglibIntenc(Object targetObject) {
this.targetObject = targetObject;
Enhancer enhancer = new Enhancer();//通过类Enhancer创建代理对象
enhancer.setSuperclass(this.targetObject.getClass());//传入创建代理对象的类
enhancer.setCallback(this);//设置回调
return enhancer.create();//创建代理对象
}
@Override
public Object intercept(Object arg0, Method method, Object[] args, MethodProxy arg3) throws Throwable {
PersonserviceBean bean = (PersonserviceBean) targetObject;// 因为在程序里targetObject为PersonServiceBean
Object result = null;
if (bean.getUser() != null)// 判断user是否为空
result = method.invoke(targetObject, args);// 如果不为空交给目标对象进行处理.
// TODO Auto-generated method stub
return result;
}
}
4、cglib与Proxy的主要区别是cgilib创建代理不需要目标类实现接口,但Proxy类需要目标类实现接口。
分享到:
相关推荐
1. **CGLib实现AOP** 首先,定义一个接口或抽象类(例如`MyService`),然后创建其实现类(例如`MyServiceImpl`)。接下来,我们需要创建一个`MethodInterceptor`,这是CGLib的核心,它会在目标方法执行前后进行...
CGLIB(Code Generation Library)是在运行期间生成子类来实现代理,因此它适用于没有实现接口的类。CGLIB是一个强大的高性能的代码生成库,它在许多AOP框架中如Spring AOP中被使用。以下是CGLIB的一些关键知识点: ...
本示例"spring-demo20-CGLIB动态代理.zip"主要展示了如何使用CGLIB库在Spring框架中实现动态代理。 CGLIB(Code Generation Library)是一个强大的高性能的代码生成库,它在许多AOP框架中被使用,如Spring AOP和...
在这个例子中,我们创建了一个CGLIB代理对象,当调用`myMethod()`时,会在调用前后分别打印"Before method execution"和"After method execution",实现了方法的拦截。 总的来说,CGLIB作为Java中的一个强大工具,...
1. **代理实现**: CGlib通过创建目标类的子类来实现代理,从而可以在子类的方法中插入切面代码,达到AOP的效果。 2. **性能优势**: 相比于使用Java反射,CGlib通过字节码技术提高了方法调用的效率。 3. **简单易用**...
在"AOP 动态代理demo"项目中,我们可以预期看到以下几个方面的内容: 1. **代理对象的创建**:无论是JDK动态代理还是CGLIB,都需要创建代理对象。对于JDK动态代理,这通常涉及到`Proxy.newProxyInstance()`方法的...
总的来说,Spring中的动态代理是通过Java Proxy或cglib来实现的,它们都提供了一种在不修改原有代码的情况下,对方法调用进行拦截和扩展的机制。Java Proxy适用于目标对象实现了接口的情况,而cglib则适用于没有接口...
在附件的"demo"中,可能包含了这两个代理方式的示例代码,包括如何创建和使用代理对象,以及如何在`InvocationHandler`或`MethodInterceptor`中添加自定义逻辑。通过阅读和理解这些代码,你可以更深入地了解Java动态...
CGlib(Code Generation Library)是另一个常用的动态代理库,它基于ASM库,能够在运行时动态生成子类来实现代理。CGlib适用于没有实现接口的类,因为JDK动态代理只能代理实现了接口的类。以下是一个使用CGlib创建...
Cglib是一个强大的高性能的代码生成库,它在Java运行时可以动态地创建子类对象,从而实现对方法的拦截。Cglib是基于ASM这个底层字节码操作框架的,它广泛应用于许多AOP(面向切面编程)的框架中,如Spring AOP和...
在这个“代理模式Demo”中,我们将深入探讨代理模式的概念、作用以及如何通过代码实现。 1. **代理模式的基本概念** 代理模式属于结构型设计模式,它创建了一个代理对象来控制对原对象的访问。代理对象与目标对象...
1. **经典代理模式Demo**:演示了如何通过CGLIB代理实现方法的拦截,以及在方法调用前后执行自定义操作。 2. **基于注解的AOP Demo**:展示了如何在切面类中使用注解定义通知,并在运行时自动织入切面。 3. **基于...
总结来说,"JavaProxy Demo"是一个介绍和演示Java动态代理技术的实例,包括JDK和CGLIB两种实现方式,以及它们在实际场景中的应用。通过学习和分析这个Demo,开发者可以深入理解动态代理的概念,掌握如何在项目中利用...
CGLIB是通过创建目标类的子类来实现代理的,因此对于没有接口的类,CGLIB是更好的选择。CGLIB的核心是`net.sf.cglib.proxy.Enhancer`类和`MethodInterceptor`接口。 1. 创建Enhancer实例,并设置回调对象,通常是...
`ClassLoader`用于加载代理对象,`Interface[]`是代理对象需要实现的接口列表,`InvocationHandler`则处理代理对象的所有方法调用。 2. **InvocationHandler接口** - `InvocationHandler`接口定义了一个方法`...
CGLIB代理的一个常见用途是在Spring AOP中,当目标对象没有实现接口时,Spring会自动选择CGLIB作为代理机制。然而,CGLIB的缺点是它比JDK代理稍微慢一些,且代理对象的创建需要更多的内存资源,因为涉及到类的继承。...
标题 "SpringXML方式实现AOP demo" 涉及到的是使用Spring框架通过XML配置来实现面向切面编程(AOP)的知识。面向切面编程是Spring框架的一个核心特性,它允许开发者在不修改原有业务代码的情况下,对系统进行横切...
**CGlib** 是AOP实现的一个重要工具,它通过动态代理技术来增强目标类。在Java中,如果一个类没有接口,JDK的动态代理就无法工作。这时,CGlib就派上用场了,它通过字节码技术创建目标类的子类,然后在子类中添加...