CGLIB兑现代理demo
CGLIB实现代理demo
在上片文章里说了如何用jdk自带的类Proxy来实现代理,但是在使用Proxy时要注意:目录类必须实现接口,如果目标类没有实现接口的话,可以用cglib.jar类实现代理。
1、首先从网上找到cglib进行下载,我这里用的是cglib-nodep-2.1_3.jar
2、新建java项目 CGLIBAop
2、在项目中创建程的Person.java
2、创建目标类PersonServiceBean.java
PersonServiceBean.java
3、创建代理类
4、cglib与Proxy的主要区别是cgilib创建代理不需要目标类实现接口,但Proxy类需要目标类实现接口。
在上片文章里说了如何用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类需要目标类实现接口。