CGLIB简介
CGLIB 用来对没有实现接口的类,实现代理对象的创建,原理是 生成一个子类继承这个类,这个子类就是代理对象,在这个子类中实现AOP的思想
CGLIB的使用
1. 导入jar包
这个包已经集成到spring的核心包中,只要导入spring的 spring-core-4.1.1.RELEASE.jar 就行
2. 先创建一个类
package cn.itcast.aop.demo;
public class ProductDao {
public void add(String str){
System.out.println("add===="+str);
}
public void delete (String str){
System.out.println("delete==="+str);
}
}
3. 创建一个生成代理对象的类
package cn.itcast.aop.demo;
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
public class CglibProxy implements MethodInterceptor{
private ProductDao productDao;
public CglibProxy(ProductDao productDao){
this.productDao = productDao;
}
public ProductDao createProxy(){
//使用cglib生成代理
//1.创建核心类
Enhancer enhancer = new Enhancer();
//2.为那个类生成代理
enhancer.setSuperclass(productDao.getClass());
//3.设置回调,相当于JDK动态代理中的invoke方法
enhancer.setCallback(this);
//4.创建代理对象
return(ProductDao)enhancer.create();
}
//
@Override
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
if("add".equals(method.getName())){
System.out.println("日志记录=========");
/**
* 可以 使用 method.invoke (productDao,args)
*
*/
Object invoke = methodProxy.invokeSuper(proxy, args);
//调用代理对象的方法,相当也调用父类的方法
return invoke;
}
return methodProxy.invokeSuper(proxy, args);
}
}
说明:1. 既然要生成一个类的代理对象,那么要将它传入到他的构造函数中吧
2. 再写一个方法生成这个类的对象吧,这里需要用到cglib代理的核心类 Enhancer
3. 使用Enhancer对象设置 代理对象的父类,就是 需要生成代理对象的类(因为代理对象是目标对象的子类,你要告诉它父类是谁啊)
4.使用Enhancer对象设置回调,相当于JDK动态代理中的invoke方法,这样你要实现MethodInterceptor,并在intercept中完成想要处理的类的方法
5. 在intercept方法中实现AOP思想,如在调用add方法前,实现日志记录
4.单元测试
package cn.itcast.aop.demo;
import org.junit.Test;
public class DemoE {
@Test
public void test(){
ProductDao productDao = new ProductDao();
CglibProxy proxy = new CglibProxy(productDao);
ProductDao product = proxy.createProxy();
System.out.println("---------使用aop思想处理的add方法-------");
product.add("hello!");
System.out.println("--------没有使用aop处理的delete-------");
product.delete("hello!");
}
}
结果如下:
---------使用aop思想处理的add方法-------
日志记录=========
add====hello!
--------没有使用aop处理的delete-------
delete===hello!
日志记录=========
add====hello!
--------没有使用aop处理的delete-------
delete===hello!