在上片文章里说了如何用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类需要目标类实现接口。
分享到:
相关推荐
实现MethodInterceptor简单的aop 分别用cglib和反射实现了一下
JAVA动态代理实现Demo(JDK动态代理和CGLIB动态代理)
代理模式详解-jdk与cglib动态代理与底层实现,spring中常用的设计模式,本案例是从源码到代理模式的实现。
基于MAVEN项目的CGLib动态代理原理及实现
java静态代理 jdk动态代理 cglib动态代理 代理原理
分别使用jdk和cglib实现动态代理,包含UML图。还有相关的博客链接:http://blog.csdn.net/y_love_f/article/details/46345581.博客中有具体的代理解释
JDK动态代理必须提供接口才能使用,在一些不能提供接口的环境中,只能采用其他第三方技术,比如CGLIB动态代理,这里提供CGLIB动态代理的相关jar包,供学习和测试使用。
java常用设计模式及JDK与CGLIB实现动态代理区别(源码) /** * 使用cglib动态代理 * @author * */ public class BookFacadeProxy implements MethodInterceptor{ private Object target; @Override public...
springAOP等框架中,大量用到代理技术; 两类代理技术: 1,java动态代理,见JDK文档或相关java书;...2.cglib创建代理类,比第一种更加简单,代理类和背代理类不需要实现共同接口。本例子就是cglib代理的例子,很简单
NULL 博文链接:https://gz383.iteye.com/blog/591079
Cglib代理,也叫做子类代理。在内存中构建一个子类对象从而实现对目标对象功能的扩展。如果想代理没有实现接口的类,就可以使用CGLIB实现。这是一个简单的案例。
cglib实现动态代理依赖jar包,包括asm-5.1.jar和cglib-3.2.4.jar
cglib通过继承方式实现代理,也就是基于类,在子类中采用方法拦截的技术拦截所有父类方法的调用并顺势织入横切逻辑。 我们最终是通过一个代理对象去调用方法的,那我们就要获取一个代理对象,cglib代理,是通过...
cglib实现动态代理,有源代码,详细的实例,逐步分析,实现动态代理。
AOP之JDK动态代理和CGLib动态代理 ,具体效果和过程看博文 http://blog.csdn.net/evankaka/article/details/45195383
CGlib动态代理类jar包,一共四个jar包,模拟CGlib动态代理用得到。
cglib动态代理相关jar包,亲测可用cglib动态代理相关jar包,亲测可用cglib动态代理相关jar包,亲测可用
spring-demo20-CGLIB动态代理.zip
cglib动态代理用到的两个包 cglib动态代理用到的两个包 cglib动态代理用到的两个包