2021-05-03 09:52  阅读(131)
文章分类:Spring 入门教程 文章标签:SpringSpring 教程
©  原文作者:一点教程 原文地址:http://www.yiidian.com/spring/

上篇教程《AOP底层-JDK动态代理》中使用JDK动态代理生成代理类对象,有个前提条件是,目标对象必须实现接口,也就是说目标对象没有接口,是无法通过JDK动态代理生成代理类对象。那这时一个没有接口的目标对象能不能产生代理类对象呢?答案是:可以的! 可以生成它的子类,这个子类也作为代理类,我们称为子类代理

接着看下面Cglib的案例:

需求:和JDK动态代理的一样,也希望在CustomerServiceImpl的save,update方法执行之前记录日志。

一、导入Cglib的支持包

202105030952020061.png

二、编写业务类

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();
    	}
    	
    }
    

五、运行结果

202105030952020562.png

从运行结果看出,CustomerServiceImpl类的save和update方法都成功在执行之前,切入了日志代码。

注意:执行原理和之前JDK动态代理方式非常类似,有兴趣可以参考上一篇教程:《AOP底层-JDK动态代理》。

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

点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> AOP底层-Cglib子类代理
上一篇
AOP底层-JDK动态代理
下一篇
SpringAOP的HelloWorld