作者:京东物流 钟磊
1 前言
最近在梳理接口逻辑的时候发现,代码中运用的战略和职责链规划形式给我留下了十分深入的印象。一个事务逻辑流程通常十分适宜运用职责链和战略规划形式来完成,因为一个事务需求通常能够拆分成一个个独立的逻辑处理单元并按次序组合而成,而职责链规划形式能够很好的链接整个事务流程,一起战略规划形式能够将事务中改动的算法部分抽离出来,然后复用主要的公共逻辑并能够灵敏替换事务算法,运用这两种规划形式能够灵敏扩展咱们的代码以习惯不同的事务需求。由于这两种规划形式十分实用,下面简单介绍一下我对这两种规划形式的了解和它们在Spring结构源码中的运用。
2 职责链规划形式的一般界说
职责链规划形式是规划形式中的一种行为型规划形式。其基础结构类似于一个链条,整个链条由一个个独自的链环组成,每个链环在程序代码中便是一个独立的处理单元,每个处理单元都有自己担任的共同逻辑,当一个处理恳求来到这个链条后,会顺次沿着每个处理单元进行传递直到这个恳求被处理完毕停止。
2.1 运用场景:
1.一个事务恳求需求经过一组处理单元的处理。这种场景类似于一个事务逻辑流程中设置了多个功用不同的处理单元,一个事务恳求需求经过这多个处理单元的串行处理。
2.程序中存在能处理同一个恳求的多个处理单元,但决议详细运用哪个处理单元需求在程序运行时依据恳求动态确认。
2.2 类图结构和Spring AOP结构中的运用
1:类图结构
2:职责链规划形式在Spring AOP结构中的运用
Spring结构中的AOP模块就运用了职责链规划形式将方针办法的一次调用过程包装成了一条办法调用链来增强方针办法。Spring AOP模块中包含了Before、After、AfterReturning、AfterThrowing、Around这五种告诉办法,Spring AOP模块将这些告诉办法和方针办法经过动态署理的办法包装成了一条调用链来分别履行各个告诉模块的处理逻辑,下面是Spring AOP的源码剖析图。
Spring AOP经过递归的办法来完成职责链的功用,首先将一切的告诉办法进行排序,然后运用一个List索引来控制整个履行流程的开始和结束,在整个职责链中Before告诉担任履行前置处理,After告诉担任履行后置处理,AfterReturning办法担任在方针办法成功履行返回后履行处理逻辑,AfterThrowing办法担任在方针办法异常履行后履行处理逻辑。Spring AOP将告诉办法包装成办法调用链上的每一个节点,巧妙地运用职责链形式完成了方针办法的处理增强。
3:泛化的职责链规划形式
在日常代码的编写中,职责链规划形式并不需求如此严厉的结构,只要代码整体流程由一个个独立的处理单元构成,而且按一定次序组合组合而成,那么也能够看作是一种愈加泛化的职责链规划形式,也能很好的满意开闭准则,例如下面这种愈加常用的代码结构。
上面这种结构同样也能完成职责链处理功用,也能够愈加简练的进行编写,同样能够很好的进修正和灵敏扩展,在保护代码的适宜也会愈加明晰。
2.3 职责链形式的长处:
1.每个处理节点都有自己的共同的处理逻辑,明确各安闲整个流程中的职责,契合类的单一职责准则。
2.构建的职责链能够依据事务需求进行灵敏改动,能动态进行次序调整以及动态插拔,满意重要的开闭准则。
3.降低了恳求发送者以及恳求处理者之间的耦合度。
3 战略规划形式的一般界说
战略规划形式同样也是规划形式中的一种行为型规划形式,其在结构上的表现便是将可变的算法战略部分从事务代码逻辑中独立出来,将这些算法战略构成战略池,然后能够随时替换和更新,使得咱们的代码结构愈加灵敏、更易扩展。
3.1 运用场景
1:当代码需求依据上下文逻辑来挑选运用不同的事务算法时,咱们能够运用战略规划形式来优化代码的判别结构,然后防止很多的if/else分支判别。
2:当代码的主体处理逻辑大致相同,仅仅在部分的事务算法上存在不一起,能够将这些不同的事务算法抽离出来,然后能防止很多重复的代码编写,并能复用主体代码逻辑。
3.2 类图结构和Spring结构中的运用
1:类图结构
2:Spring结构中的运用
Spring结构中给咱们开发者留下了十分多的扩展战略点,完成了可动态插拔的功用扩展,其间典型的一个战略扩展点便是BeanPostProcessor接口,BeanPostProcessor接口答应咱们在Bean的初始化前和初始化后做一些逻辑处理战略来改动Bean的特点,答应咱们对Bean进行改造和个性化,Spring AOP便是运用BeanPostProcessor这个战略扩展点完成了动态署理Bean的创立,下面是Spring AOP后置处理器的源码剖析。
Spring AOP经过导入AspectJAwareAdvisorAutoProxyCreator这个完成了BeanPostProcessor接口的后置处理器,在Bean初始化后进行了一个动态署理类的创立,其在postProcessAfterInitaliztion办法中的WarpIfNecessary中办法中完成了署理类的创立。Spring结构运用这种模板加战略的规划形式让咱们能够个性化扩展结构的功用,让结构变得十分灵敏可扩展,咱们也能够依据事务需求加入自己的BeanPostProcessor战略来完成自己的共同逻辑,很好地满意了重要的开闭规划准则。
3:泛化的战略规划形式
同样地咱们也不必严厉依照界说的战略规划形式进行编写,只要在整体上满意事务主体逻辑不变,将改动部分抽离出来,构成能够按需扩展的战略思维就行了,下面以SpringBoot主动安装的源码来说明这种愈加泛化的战略形式。SpringBoot主动安装机制是依照用户当前的代码运行环境并结合**@Conditional**注解来动态为咱们主动加载需求运用的类,这种战略规划形式是一种愈加泛化的战略规划形式,同样满意战略规划形式的按需挑选,动态插拔的规划准则。SpringBoot的主动安装机制的原理如下:
①SpringBoot在**@EnableAutoConfiguration注解中运用了@import**注解导入了
EnableAutoConfigurationImportSelector类。
②运用EnableAutoConfigurationImportSelector类的selectImports办法来加载jar包里面META-INF/spring.factories文件中配好的类。
③最终结合各种**@Conditional**注解来完成按需加载的战略规划形式。
SpringBoot这种按需主动安装的战略规划思维,在结构上并不严厉契合战略规划形式的结构,但他的整体规划思维十分契合战略规划形式,咱们在项目中也能够经过配置文件的办法来灵敏切换咱们代码中运用的战略算法。
3.3 战略规划形式的长处:
1:能够在程序运行时动态挑选切换需求运用的独立事务算法。
2:将可变的事务算法与事务主体逻辑剥离,完成愈加灵敏的保护和扩展。
3:满意开闭准则,无需修正原有的代码逻辑就能完成不同事务算法灵敏切换。
4 结合战略规划形式和职责链规划形式
将战略规划形式和职责链规划形式进行结合就能构成灵敏可扩展的流程结构,能应对多变的事务需求,下面是将两者进行结合的结构图。
一个request在经过每一个handler处理单元时,会依据request的上下文内容挑选适宜的战略进行处理,然后将这一切的handler串联起来构成完好的事务流程。
5 总结
在日常代码的编写中,事务需求的改动总是不定的,这样会导致咱们的代码会频繁的跟着需求的改动进行调整,稍加不注意的话就会导致咱们的代码十分臃肿和杂乱,累加到一定程度后会变得难以保护,这时预先运用适宜的代码规划形式能有用的缓解这种情况,文中描述的职责链和战略规划形式能有用满意代码编写的开闭准则,能愈加有用的应对随时改动的事务需求。