spring aop原理之二 cglib动态代理

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

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

在这里插入图片描述

  • 创建没有实现接口的类
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();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值