动态代理之——cglib动态代理
1.概述
Spring AOP使用两种代理机制:JDK动态代理和cglib动态代理之所以需要两种动态代理,很大程度上是因为JDK动态代理只能提供接口的代理,而不支持类的代理。cglib动态代理则很好弥补了这一不足。
2.案例
OldSale类:
public class OldSale {
public void sale(Float money) {
System.out.println("以"+money+"的价格销售了一件产品");
}
}
MethodInterceptor接口的实现类:
```java
public class MyMethodInterceptor implements MethodInterceptor {
private OldSale oldSale;
public MyMethodInterceptor(OldSale oldSale) {
this.oldSale = oldSale;
}
/***
* 增强的内容
* @param o 代理对象,增强后的对象
* @param method 代理的方法
* @param objects 代理的方法的参数
* @param methodProxy 代理方法,增强后的方法
*/
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
Object invoke = method.invoke(oldSale, objects);
/*Object o1 = methodProxy.invokeSuper(o, objects);*/
if ((Float) objects[0] > 1500) {
System.out.println("赚了");
} else {
System.out.println("亏了");
}
return null;
}
}
测试类:
public class SaleTest {
@Test
public void teseCglib(){
OldSale oldSale = new OldSale();
//创建增强类
Enhancer enhancer = new Enhancer();
//指定代理类的父类
enhancer.setSuperclass(oldSale.getClass());
//设置回调函数
enhancer.setCallback(new MyMethodInterceptor(oldSale));
OldSale sale = (OldSale)enhancer.create();
sale.sale(2000f);
}
}