java代理之cglib代理

2020-12-10  本文已影响0人  Restart白蓝

上一篇
JDK的动态代理
JDK这个动态代理呢,有个缺点,就是目标类(被代理的类)没有实现任何接口,那么增强类也不能去对应实现接口,也就没办法用了。

但是可以使用cglib代理来解决这个问题
cglib与动态代理最大的区别就是
1.使用动态代理的对象必须实现一个或多个接口
2.使用cglib代理的对象则无需实现接口,达到代理类无侵入。

spring 的AOP底层 就是有JDK的动态代理和cglib的动态代理,找不到接口时他就会用cglib。

使用cglib需要引入jar包,如果你已经有spring-core的jar包,则无需引入,因为spring中包含了cglib,并且如果引入的是spring-context那么也不需要,因为context又包涵了core.


image.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);
    }
}

四、查看结果

有木有,更加方便了呢。


image.png
上一篇 下一篇

猜你喜欢

热点阅读