读书人

CGLIB兑现代理demo

发布时间: 2012-08-26 16:48:06 作者: rapoo

CGLIB实现代理demo
在上片文章里说了如何用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();//创建代理对象}@Overridepublic Object intercept(Object arg0, Method method, Object[] args, MethodProxy arg3) throws Throwable {PersonserviceBean bean = (PersonserviceBean) targetObject;// 因为在程序里targetObject为PersonServiceBeanObject result = null;if (bean.getUser() != null)// 判断user是否为空result = method.invoke(targetObject, args);// 如果不为空交给目标对象进行处理.// TODO Auto-generated method stubreturn result;}}



4、cglib与Proxy的主要区别是cgilib创建代理不需要目标类实现接口,但Proxy类需要目标类实现接口。

读书人网 >软件架构设计

热点推荐