这篇文章将为大家详细讲解有关怎么在Java中动态代理Cglib,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
1.SpringMVC,Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架。2.Shiro,Apache Shiro是Java的一个安全框架。3.Mybatis,MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。4.Dubbo,Dubbo是一个分布式服务框架。5.Maven,Maven是个项目管理和构建自动化工具。6.RabbitMQ,RabbitMQ是用Erlang实现的一个高并发高可靠AMQP消息队列服务器。7.Ehcache,EhCache 是一个纯Java的进程内缓存框架。
经测试,jdk创建对象的速度远大于cglib,这是由于cglib创建对象时需要操作字节码。cglib执行速度略大于jdk,所以比较适合单例模式。另外由于CGLIB的大部分类是直接对Java字节码进行操作,这样生成的类会在Java的永久堆中。如果动态代理操作过多,容易造成永久堆满,触发OutOfMemory异常。spring默认使用jdk动态代理,如果类没有接口,则使用cglib。
package proxy.cglib;
public class OrderServiceImpl {
/**
* 下单
*
* @param orderNo 订单号
* @return 结果
*/
public String preOrder(String orderNo) {
System.out.println("OrderServiceImpl.preOrder" + orderNo);
return "下单成功";
}
/**
* 下单
*
* @return 结果
*/
public String list() {
return "list";
}
}
package proxy.cglib;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.Objects;
/**
* @Description: <br/>
* Cglib 通过继承的方式 实习代理
* final类 和 final 方法 不能代理
* <p>
* <br/>
* @Author: Qz1997
* @create 2021/5/1 13:24
*/
public class CglibProxyFactory implements MethodInterceptor {
/**
* 创建一个代理对象
*
* @param clazz 类型
* @return 代理对象
*/
public Object creatProxyedObj(Class<?> clazz) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return enhancer.create();
}
/**
* 代理方法
*
* @param proxyObject 代理对象
* @param method 方法
* @param args 方法参数
* @param methodProxy 代理方法
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object proxyObject, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
// 判断方法参数 如果是null || 参数格式 <= 0
if (Objects.isNull(args) || args.length <= 0) {
return methodProxy.invokeSuper(proxyObject, args);
}
/// // 判断这个方法上是否包含某个注解
// if (method.isAnnotationPresent(Async.class)) {
// // ....进行一顿增强
// // return method.invoke(proxy, arg);
// }
Parameter[] parameters = method.getParameters();
Parameter parameter = parameters[0];
Class<?> type = parameter.getType();
// 类型为String
if (type == String.class) {
String orderNo = (String) args[0];
if (Objects.nonNull(orderNo) && orderNo.length() < 10) {
throw new RuntimeException("订单号错误");
}
}
String result = (String) methodProxy.invokeSuper(proxyObject, args);
if (Objects.equals(result, "下单成功")) {
System.out.println("发动订单短信");
}
return result;
}
}
关于怎么在Java中动态代理Cglib就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。