当前位置: 首页 > news >正文

网站推广策划案seo教程wordpress 数据库名贵

网站推广策划案seo教程,wordpress 数据库名贵,有哪些网站建设公司,做网站广告语Spring Aop 看这个分享的应该都用过Spring Aop,这里就不再过多介绍了它是什么了。 我抽取了Spring Aop的部分源码,通过它实现请求参数可变拦截,同时apisdk离开Spring框架,仍然可以正常运行。 讲拦截也好,通知也罢&a…

Spring Aop

看这个分享的应该都用过Spring Aop,这里就不再过多介绍了它是什么了。

我抽取了Spring Aop的部分源码,通过它实现请求参数可变拦截,同时apisdk离开Spring框架,仍然可以正常运行。

讲拦截也好,通知也罢,大家知道是什么意思就行了,不需要纠结这个叫法。

核心拓展类

利用Aop的前置通知,拓展了前置参数可变通知,原理是在运行的过程中,动态封装请求上下文SdkContext参数,变更请求参数。

在这里插入图片描述

上面圈的类是参照Aop的代码结构,拓展出的通知,描述如下:

  • MethodBeforeArgsChangeableAdvice:需要开发者实现的接口,在apisdk中唯一实现SdkContextArgsBeforeChangeableAdvice,实现了SdkContext的构建
  • MethodBeforeChangeableAdviceAdapter:适配器,把开发者实现的MethodBeforeArgsChangeableAdvice交给底层去执行,是框架执行开发者代码的入口
  • MethodBeforeChangeableAdviceInterceptor:执行开发者的MethodBeforeArgsChangeableAdvice,最后把结果添加到方法参数上
  • SdkContextArgsBeforeChangeableAdvice:MethodBeforeArgsChangeableAdvice的唯一实现,实现了SdkContext的关键代码

核心代码

SdkContext自动封装

public class SdkContextArgsBeforeChangeableAdvice implements MethodBeforeArgsChangeableAdvice {@Overridepublic Object before(Method method, Object[] args, Object target) throws Throwable {// 判断执行的方法是否需要自动注入 SdkContext// 如果用户的接口声明的方法参数有 SdkContext,则说明用户要手动创建,否则底层自动创建boolean isAutoType = MethodWrapperCache.isAutoType(method);if (isAutoType) {// SdkContextManager 封装了域名、secret、token等服务的调用SdkContextManager instance = SdkContextManager.getInstance();SdkContext sdkContext = instance.getSdkContext();return sdkContext;}return null;}
}

动态调整请求参数

MethodBeforeChangeableAdviceInterceptor

public class MethodBeforeChangeableAdviceInterceptor implements MethodInterceptor, BeforeAdvice {private MethodBeforeArgsChangeableAdvice advice;public MethodBeforeChangeableAdviceInterceptor(MethodBeforeArgsChangeableAdvice advice) {this.advice = advice;}@Overridepublic Object invoke(MethodInvocation mi) throws Throwable {// 调用开发者的 MethodBeforeArgsChangeableAdviceObject arg = this.advice.before(mi.getMethod(), mi.getArguments(), mi.getThis());if (arg != null && mi instanceof ReflectiveMethodInvocation) {// 将 MethodBeforeArgsChangeableAdvice 返回的结果,添加到调用方法((ReflectiveMethodInvocation) mi).appendArgument(arg);}return mi.proceed();}
}

ReflectiveMethodInvocation#appendArgument

public class ReflectiveMethodInvocation implements MethodInvocation {// 方法参数protected Object[] arguments;// 调整方法请求参数public void appendArgument(Object obj) {if (this.arguments != null && this.arguments.length > 0) {int length = this.arguments.length;Object[] newArgs = new Object[length + 1];System.arraycopy(this.arguments, 0, newArgs, 0, length);newArgs[length] = obj;this.arguments = newArgs;} else {this.arguments = new Object[1];this.arguments[0] = obj;}}
}

Jdk 动态代理

原始接口A和增强接口B,他们的实例化必须由动态代理支持。apisdk有SdkManager和JdkDynamicAopProxy两个代理对象生成器,SdkManager是原代码中就有的,JdkDynamicAopProxy是我参考Spring aop拓展的。

二开后,SdkManager用于生成B的代理对象,JdkDynamicAopProxy用于生成A的代理对象,并且配置了一系列的拦截动作。

开发逻辑:开发者使用A的代理对象,调用方法,底层执行A方法,执行拦截动作,再拿到B的代理对象,执行B的方法。

JdkDynamicAopProxy代码如下:

public class JdkDynamicAopProxy implements InvocationHandler {// 包装被代理的对象,每个被代理的对象都有一组Adviceprivate AdvisedSupport advised;public JdkDynamicAopProxy(AdvisedSupport advised) {this.advised = advised;}public Object getProxy() {return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), advised.getProxiedInterfaces(), this);}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 获取被代理的对象Object target = advised.getTarget();// 获取 Method 匹配的所有 AdviceList<Object> chain = this.advised.getInterceptors(method, target.getClass());Object retVal;if (chain.isEmpty()) {// 没有 Advice,直接执行 MethodretVal = method.invoke(target, args);} else {// 递归调用 AdviceReflectiveMethodInvocation reflectiveMethodInvocation = new ReflectiveMethodInvocation(proxy, target, method, args, chain);retVal = reflectiveMethodInvocation.proceed();}return retVal;}
}
http://www.yayakq.cn/news/152336/

相关文章:

  • 做书评的网站有哪些内容营销是一种什么模式
  • 做淘宝网站怎么弄的字体logo在线生成器
  • 上线倒计时单页网站模板免费网站怎么建立
  • 山东咕果做网站怎么样网站建设需要多少
  • 排名好的手机网站建设漯河专业做网站的公司
  • 奉贤专业做网站中国知名网站排名
  • 怎么为做的网站配置域名安卓蓝牙app开发教程
  • 赤峰公司网站建设网站建设天津
  • 农业农村部农田建设管理司网站灯具公司网站模板
  • 商业设计网站著名网站用什么语言做后台
  • 大网站怎样选域名晨星wordpress
  • 宁波企业如何建网站月入百万的游戏代理
  • 朔州网站建设电话免费logo图片生成器 自动生成
  • 网站可以叫做系统吗腾讯广告平台
  • 向搜索引擎提交网站沈阳网站建设德泰诺
  • 东莞网站建设渠道郑州seo技术博客
  • 公司建设网站费用直接列支海口网站如何制作
  • 网站建设都有什么功能空间设计是什么
  • 开县做网站wordpress外贸主题购买
  • 互站网新手网站设计定价
  • 网站开发 青岛长沙最近什么传染病
  • 展示系统 网站模板广州网站建设哪家公司好
  • 信用网站建设意见手机在线ps照片处理
  • 工作号做文案素材的网站河源抖音seo讯息
  • 网站注册地网线制作心得与体会
  • 商务网站建设策划书的格式discuz应用中心
  • 用ps切片做网站网络软文营销是什么意思
  • 网站建设对企业的意义网站的建设和设计方案
  • 太原深圳建设工程信息网站手机网站建设公司哪家好
  • 专业搜索引擎seo服务兰州人工优化