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动态代理》。

 

源码下载:http://pan.baidu.com/s/1bBuDKa