spring aop原理之二 cglib动态代理

cglib动态代理 也是spring aop底层原理之一,是针对与没有实现接口的类产生代理对象。

  • 首先使用cglib 动态代理 我们需要导入spring 基本的jar包

spring aop原理之二 cglib动态代理

  • 创建没有实现接口的类
package cglib;

/**
 * @Author: Han Yu
 * @Description:
 * @Date: Create in 19:58 2019/1/15
 */
public class CustomerDao {
    public void save() {
        System.out.println("保存用户");
    }


    public void update() {
        System.out.println("修改用户");
    }


    public void delete() {
        System.out.println("删除用户");
    }


    public void find() {
        System.out.println("查找用户");
    }
}

  • 使用cglib产生动态代理对象
package cglib;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @Author: Han Yu
 * @Description:
 * @Date: Create in 19:58 2019/1/15
 */
public class CglibProxy implements MethodInterceptor {
    private CustomerDao customerDao;
    public CglibProxy(CustomerDao customerDao){
        this.customerDao = customerDao;

    }
//    使用cglib 产生代理对象
     public CustomerDao createProxy(){
        //创建Cglib核心类对象
         Enhancer enhancer = new Enhancer();
         //设置父类
         enhancer.setSuperclass(customerDao.getClass());
         //设置回调 (类似与InvocationHandler)
         enhancer.setCallback(this);
         //创建代理对象
         CustomerDao customerDao =(CustomerDao) enhancer.create();
         return customerDao;
     }

    @Override
    public Object intercept(Object proxy , Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        //判断方法是不是save
        if("save".equals(method.getName())){
            //增强
            System.out.println("增强");
            return methodProxy.invokeSuper(proxy,objects);
        }
        return methodProxy.invokeSuper(proxy,objects);
    }
}

  • 测试类
package cglib;

import org.junit.Test;

/**
 * @Author: Han Yu
 * @Description:
 * @Date: Create in 20:07 2019/1/15
 */
public class CglibTest {
    @Test
    public void cglibTest(){
        CustomerDao customerDao = new CustomerDao();
        CustomerDao proxy = new CglibProxy(customerDao).createProxy();
        proxy.save();
    }
}