AOP底层-Cglib子类代理
上篇教程《AOP底层-JDK动态代理》中使用JDK动态代理
生成代理类对象,有个前提条件是,目标对象必须实现接口,也就是说目标对象没有接口,是无法通过JDK动态代理生成代理类对象。那这时一个没有接口的目标对象能不能产生代理类对象呢?答案是:可以的! 可以生成它的子类,这个子类也作为代理类,我们称为子类代理
。
接着看下面Cglib的案例:
需求:和JDK动态代理的一样,也希望在CustomerServiceImpl的save,update方法执行之前记录日志。
一、导入Cglib的支持包
二、编写业务类
CustomerServiceImpl(这时目标对象,没实现任何接口)
package com.yiidian.service;
/**
* 这个类在AOP属于目标对象(Target)
* 注意:该类没有实现任何接口
* @author http://www.yiidian.com
*
*/
public class CustomerServiceImpl{
public void save() {
System.out.println("执行save方法");
}
public void update() {
System.out.println("执行update方法");
}
}
三、编写Cglib子类代理工具类
package com.yiidian.proxy;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import com.yiidian.service.CustomerServiceImpl;
/**
* @author http://www.yiidian.com
*
*/
public class CglibProxyUtils {
/**
* 使用Cglib工具创建目标对象的子类对象
* @param target
* @return
*/
public static Object getProxy(final Object target){
return Enhancer.create(CustomerServiceImpl.class, new MethodInterceptor() {
//intercept:每次代理类对象执行方法的时候执行该方法
@Override
public Object intercept(Object arg0, Method method, Object[] arg2,
MethodProxy arg3) throws Throwable {
System.out.println("记录日志");
//调用目标对象的方法
return method.invoke(target, arg2);
}
});
}
}
该工具类,专门用于生成任何类的子类代理对象,我们用于生成CustomerServiceImpl(目标对象)的子类代理对象。
四、编写测试类
package com.yiidian.test;
import org.junit.Test;
import com.yiidian.proxy.CglibProxyUtils;
import com.yiidian.service.CustomerServiceImpl;
/**
* @author http://www.yiidian.com
*
*/
public class Demo1 {
/**
* 演示Cglib子类代理
*/
@Test
public void test2(){
//目标对象
CustomerServiceImpl service = new CustomerServiceImpl();
//获取子类代理对象
CustomerServiceImpl proxy = (CustomerServiceImpl)CglibProxyUtils.getProxy(service);
//调用代理对象
proxy.save();
proxy.update();
}
}
五、运行结果
从运行结果看出,CustomerServiceImpl类的save和update方法都成功在执行之前,切入了日志代码。
注意:执行原理和之前JDK动态代理方式非常类似,有兴趣可以参考上一篇教程:《AOP底层-JDK动态代理》。
热门文章
优秀文章