从零并发框架(三)异步转同步注解+字节码增强代理实现( 四 )
通过动态代理进行代码增强 , SyncBs.newInstance().syncContext(context).execute(); 这里就是对于增强方法的执行 。
cglib 字节码增强package com.github.houbb.sync.core.support.proxy.cglib;import com.github.houbb.sync.api.api.ISyncContext;import com.github.houbb.sync.core.bs.SyncBs;import com.github.houbb.sync.core.core.SimpleSyncContext;import com.github.houbb.sync.core.support.proxy.ISyncProxy;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;/** * CGLIB 代理类 * @author binbin.hou * date 2019/3/7 * @since 0.0.1 */public class CglibProxy implements MethodInterceptor, ISyncProxy {/*** 被代理的对象*/private final Object target;public CglibProxy(Object target) {this.target = target;}@Overridepublic Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {ISyncContext context = SimpleSyncContext.newInstance().method(method).params(args).target(target);return SyncBs.newInstance().syncContext(context).execute();}@Overridepublic Object proxy() {Enhancer enhancer = new Enhancer();//目标对象类enhancer.setSuperclass(target.getClass());enhancer.setCallback(this);//通过字节码技术创建目标对象类的子类实例作为代理return enhancer.create();}}对于没有接口的方法 , 我们通过 cglib 进行代码增强 , 这点和 spring aop 是保持一致的 。
代理的调用我们把三种场景的代理都实现了 , 那么应该如何判断方法应该调用哪一个代理呢?
这里有一个基本是公用方法 , 如下:
/* * Copyright (c)2019. houbinbin Inc. * async All rights reserved. */package com.github.houbb.sync.core.support.proxy;import com.github.houbb.heaven.util.lang.ObjectUtil;import com.github.houbb.sync.core.support.proxy.cglib.CglibProxy;import com.github.houbb.sync.core.support.proxy.dynamic.DynamicProxy;import com.github.houbb.sync.core.support.proxy.none.NoneProxy;import java.lang.reflect.Proxy;/** *代理信息我们根据类本身 , 选择调用的代理类 。
* *Created: 2019/3/8 10:38 AM *Project: async * * @author houbinbin * @since 0.0.1 */public final class SyncProxy {private SyncProxy(){}/*** 获取对象代理* @param泛型* @param object 对象代理* @return 代理信息* @since 0.0.6*/@SuppressWarnings("all")public staticT getProxy(final T object) {if(ObjectUtil.isNull(object)) {return (T) new NoneProxy(object).proxy();}final Class clazz = object.getClass();// 如果targetClass本身是个接口或者targetClass是JDK Proxy生成的,则使用JDK动态代理 。// 参考 spring 的 AOP 判断if (clazz.isInterface() || Proxy.isProxyClass(clazz)) {return (T) new DynamicProxy(object).proxy();}return (T) new CglibProxy(object).proxy();}}
(1)空对象 , 不做增强
(2)接口或者代理类 , 使动态代理实现
(3)其他使用 cglib 进行字节码增强 。
验证春种秋收 , 我们辛苦忙活到现在 , 终于可以验证一下自己的成果了 。
上述代码已经上传到 maven 仓库 , 实际可以直接调用 。
maven 项目依赖入门测试业务代码通过 @Sync 指定需要转同步的方法 , 通过 @SyncCallback 指定回调方法 。
推荐阅读
- 青少年|封面评论 |“青少年模式”依旧漏洞百出,标准化合规框架必须落地
- 打造智慧互联新高地——惠阳(良井)智慧互联科技园项目合作框架协议今天签约
- Swagger2—API文档框架(二)
- 在Linux系统中安装深度学习框架Pytorch
- 海外商家试水小程序商城,微盟国际化战略框架已现
- Redis集群做法的难点,百万并发客户端「实战」
- 整理:常见的Java开发框架有哪些,看过,就赶紧收藏吧
- 为什么 Redis 单线程能支撑高并发?
- 并发过程中volatile能否保证线程安全
- Python|TensorFlow 、Caffe等9大主流人工智能框架优劣势分析
