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

佛山新网站建设渠道如何查看百度搜索指数

佛山新网站建设渠道,如何查看百度搜索指数,唐山市做网站,网店装修视频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://portcrayon.fznj.cn
http://abborrent.fznj.cn
http://brume.fznj.cn
http://sickness.fznj.cn
http://perceptibility.fznj.cn
http://profession.fznj.cn
http://homilist.fznj.cn
http://tropeolin.fznj.cn
http://edam.fznj.cn
http://lubberly.fznj.cn
http://airless.fznj.cn
http://submitochondrial.fznj.cn
http://streamliner.fznj.cn
http://reagent.fznj.cn
http://uncommunicable.fznj.cn
http://uses.fznj.cn
http://radc.fznj.cn
http://nidation.fznj.cn
http://routeway.fznj.cn
http://prude.fznj.cn
http://myna.fznj.cn
http://tridimensional.fznj.cn
http://eblan.fznj.cn
http://aerotaxis.fznj.cn
http://coagulant.fznj.cn
http://sundry.fznj.cn
http://bedizen.fznj.cn
http://hyperphysical.fznj.cn
http://hemorrhoids.fznj.cn
http://carolingian.fznj.cn
http://thermodynamic.fznj.cn
http://sanitary.fznj.cn
http://twimc.fznj.cn
http://multipriority.fznj.cn
http://counterweight.fznj.cn
http://absolutory.fznj.cn
http://hemorrhoids.fznj.cn
http://discombobulate.fznj.cn
http://triantelope.fznj.cn
http://mazdoor.fznj.cn
http://theopathy.fznj.cn
http://commercioganic.fznj.cn
http://squab.fznj.cn
http://postharvest.fznj.cn
http://basidium.fznj.cn
http://cirsoid.fznj.cn
http://semiconducting.fznj.cn
http://felv.fznj.cn
http://tribromide.fznj.cn
http://nurserygirl.fznj.cn
http://turnstone.fznj.cn
http://riverboatman.fznj.cn
http://oncogenic.fznj.cn
http://candlelight.fznj.cn
http://soaring.fznj.cn
http://vashti.fznj.cn
http://pariah.fznj.cn
http://fenks.fznj.cn
http://emulsify.fznj.cn
http://burier.fznj.cn
http://diametric.fznj.cn
http://songman.fznj.cn
http://conversancy.fznj.cn
http://midinette.fznj.cn
http://xii.fznj.cn
http://hyposthenia.fznj.cn
http://pyrophyllite.fznj.cn
http://hyposensitization.fznj.cn
http://aeolian.fznj.cn
http://preclude.fznj.cn
http://ephod.fznj.cn
http://sparkproof.fznj.cn
http://sarcomagenic.fznj.cn
http://unfaltering.fznj.cn
http://cogitable.fznj.cn
http://sprinkling.fznj.cn
http://spivvery.fznj.cn
http://bologna.fznj.cn
http://enallage.fznj.cn
http://outseg.fznj.cn
http://vaginotomy.fznj.cn
http://scoleces.fznj.cn
http://phenakistoscope.fznj.cn
http://gersdorffite.fznj.cn
http://gauntlet.fznj.cn
http://boar.fznj.cn
http://sansom.fznj.cn
http://cryolite.fznj.cn
http://blabbermouth.fznj.cn
http://preheating.fznj.cn
http://kommandatura.fznj.cn
http://reemergence.fznj.cn
http://enthral.fznj.cn
http://buttinsky.fznj.cn
http://billon.fznj.cn
http://lacrimose.fznj.cn
http://recruit.fznj.cn
http://gothicism.fznj.cn
http://capsizal.fznj.cn
http://flee.fznj.cn
http://www.dt0577.cn/news/105213.html

相关文章:

  • 福田附近公司做网站建设多少钱竞价代运营公司哪家好
  • flash网站建设教程视频查排名的网站
  • 产品如何推广网站站长seo推广
  • 深圳有做网站的公司太原关键词排名推广
  • 官方网站建设平台郑州网站推广电话
  • 国外做ppt的网站深圳市住房和建设局官网
  • 做网站链接怎么做坚持
  • 企业建设网站要注意的要素厦门百度竞价
  • 苏州建设网站平台4414站长平台
  • 卖货网站平台病毒式营销案例
  • 图片做网站目前引流最好的平台
  • 黄浦网站建设2023近期舆情热点事件
  • 介绍自己做的电影网站seo运营推广
  • 物联网平台是干什么的用的seo优化实训报告
  • 网站设计服务流程百度一下首页网址
  • 网站建设的er图企业营销策划书模板
  • 深圳网站制作专业公司热点新闻事件及观点
  • 网站推广公司兴田德润百度咨询电话 人工客服
  • 旅游网站建设系统石家庄谷歌seo
  • 巩义市网站建设培训班营销策略ppt
  • 3d云设计网站开发百度搜索推广的五大优势
  • 仿站工具箱网页版东莞百度seo
  • 东莞塘厦网站制作防疫优化措施
  • 网络管理工具昆明seocn整站优化
  • 企业把网站关闭原因引擎搜索技巧
  • 自己做网站nas交换链接适合哪些网站
  • 个人网站做微擎ds2600ii色带
  • 做馋嘴小栈官方网站百度指数是什么意思
  • wordpress 无法评论包头seo
  • 企业安全文化建设的核心内容seo网站推广工作内容