上一篇
JDK的动态代理
JDK这个动态代理呢,有个缺点,就是目标类(被代理的类)没有实现任何接口,那么增强类也不能去对应实现接口,也就没办法用了。
但是可以使用cglib代理来解决这个问题
cglib与动态代理最大的区别就是
1.使用动态代理的对象必须实现一个或多个接口
2.使用cglib代理的对象则无需实现接口,达到代理类无侵入。
spring 的AOP底层 就是有JDK的动态代理和cglib的动态代理,找不到接口时他就会用cglib。
使用cglib需要引入jar包,如果你已经有spring-core的jar包,则无需引入,因为spring中包含了cglib,并且如果引入的是spring-context那么也不需要,因为context又包涵了core.
![](https://img.haomeiwen.com/i25095498/331497fda0a59494.png)
需求还是和前面一样,但是现在没有实现任何接口了。
一、先创建一个订单处理的类。
package proxy;
/**
* 目标类(被代理类)
*/
public class Order {
public String sell(String name) {
System.out.println("出售了商品" + name);
return name;
}
public String show() {
String s = "所有商品";
System.out.println("查看所有商品");
return s;
}
}
二、再写一个订单的增强类
package proxy;
/**
* Order的增强类
*/
public class PagerintiOrder {
public void init() {
System.out.println("售前准备");
}
public void last() {
System.out.println("售后记录");
}
}
三、直接就可以写个测试类来测试了
package proxy;
import org.junit.Test;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class CglibTest {
//目标类(被代理类)
Order order = new Order();
//增强类
PagerintiOrder pagerintiOrder = new PagerintiOrder();
@Test
public void pagerintiOrderTest() {
//创建一个增强器
Enhancer enhancer = new Enhancer();
//设置父类
enhancer.setSuperclass(Order.class);
//设置回调
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
pagerintiOrder.init();
String invoke = (String) method.invoke(order, objects);
pagerintiOrder.last();
return "赠送键盘," + invoke;
}
});
//测试
Order o = (Order) enhancer.create();
String s = o.sell("电脑1");
System.out.println(s);
}
}
四、查看结果
有木有,更加方便了呢。
![](https://img.haomeiwen.com/i25095498/5ccd810b20755ecd.png)
网友评论