原理解析
cglib 和jdk 代理类似,不过区别是: jdk的代理使代理类继承被代理类的接口实现的,而cglib代理使通过继承代理类实现的。
核心代码
- 需要单独引入jar包
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.1</version>
</dependency>
- 新建接口
/**
* @Classname OrderService
* @Description TODO
* @Date 2022-12-08 22:21
* @Created by lihw
*/
public interface OrderService {
String addOrder(String orderName, String orderId);
}
- 实现类
/**
* @Classname OrderServiceImpl
* @Description TODO
* @Date 2022-12-08 22:21
* @Created by lihw
*/
public class OrderServiceImpl implements OrderService{
@Override
public String addOrder(String orderName, String orderId) {
System.out.println("orderName:" + orderName + ",orderId:" + orderId);
return orderName + ":" + orderId;
}
}
- 编写代理回调
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
* @Classname CustomMethodInterceptor
* @Description TODO
* @Date 2022-12-08 22:23
* @Created by lihw
*/
public class CustomMethodInterceptor implements MethodInterceptor {
/**
*
* @param o cglib 代理类
* @param method 目标方法
* @param objects 目标方法传递的参数
* @param methodProxy 封装代理
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println(" method start");
// 调用目标方法
Object result = methodProxy.invokeSuper(o, objects);
System.out.println(" method end");
return result;
}
}
- 使用代理
import net.sf.cglib.proxy.Enhancer;
/**
* @Classname Test
* @Description TODO
* @Date 2022-12-08 22:22
* @Created by lihw
*/
public class Test {
public static void main(String[] args) {
// 创建cglib回调类
CustomMethodInterceptor customMethodInterceptor = new CustomMethodInterceptor();
Enhancer enhancer = new Enhancer();
// 设置cglib回调类
enhancer.setCallback(customMethodInterceptor);
// cglib底层 生成代理类 直接继承目标类 被代理类
enhancer.setSuperclass(OrderServiceImpl.class);
// 生成 cglib 代理类
OrderServiceImpl orderServiceImplProxy = (OrderServiceImpl)enhancer.create();
String result = orderServiceImplProxy.addOrder("lihongwei", "1234");
System.out.println("result: " + result);
}
}