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