CN114090193A - 一种请求处理方法及装置 - Google Patents
一种请求处理方法及装置 Download PDFInfo
- Publication number
- CN114090193A CN114090193A CN202111461675.2A CN202111461675A CN114090193A CN 114090193 A CN114090193 A CN 114090193A CN 202111461675 A CN202111461675 A CN 202111461675A CN 114090193 A CN114090193 A CN 114090193A
- Authority
- CN
- China
- Prior art keywords
- interface
- implementation
- bean
- routing
- class
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000003672 processing method Methods 0.000 title claims abstract description 14
- 238000005516 engineering process Methods 0.000 claims abstract description 20
- 235000010627 Phaseolus vulgaris Nutrition 0.000 claims description 104
- 244000046052 Phaseolus vulgaris Species 0.000 claims description 104
- 238000000034 method Methods 0.000 claims description 58
- 238000012545 processing Methods 0.000 claims description 30
- 230000015654 memory Effects 0.000 claims description 28
- 238000013507 mapping Methods 0.000 claims description 10
- 238000004590 computer program Methods 0.000 claims description 9
- 230000008569 process Effects 0.000 description 20
- 238000010586 diagram Methods 0.000 description 16
- 238000011161 development Methods 0.000 description 7
- 238000013461 design Methods 0.000 description 6
- 238000012986 modification Methods 0.000 description 6
- 230000004048 modification Effects 0.000 description 6
- 230000006870 function Effects 0.000 description 4
- 101001026137 Cavia porcellus Glutathione S-transferase A Proteins 0.000 description 3
- 101001026109 Gallus gallus Glutathione S-transferase Proteins 0.000 description 3
- 238000012423 maintenance Methods 0.000 description 3
- 230000000694 effects Effects 0.000 description 2
- 238000011022 operating instruction Methods 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 239000000243 solution Substances 0.000 description 2
- 230000004075 alteration Effects 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 238000002347 injection Methods 0.000 description 1
- 239000007924 injection Substances 0.000 description 1
- 239000004973 liquid crystal related substance Substances 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 230000002093 peripheral effect Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
- G06F2009/45579—I/O management, e.g. providing access to device drivers or storage
Abstract
本发明涉及金融科技(Fintech)领域,公开一种请求处理方法及装置,针对接收的业务请求,确定业务请求对应的接口;若确定接口中注入的是动态代理对象,则通过业务请求中的路由参数和接口的接口信息,从预设路由关系中确定接口的第一实现类;通过第一实现类的实例对业务请求进行处理。通过使用注解技术描述路由关系,基于动态代理,对实现对象的调用进行路由,无需为每一个接口编写一个工厂类;以及,通过替换控制器注入的服务接口为动态代理对象,实现了对接口调用者的尽可能透明。
Description
技术领域
本申请实施例涉及金融科技(Fintech)领域,尤其涉及一种请求处理方法及装置。
背景技术
随着计算机技术的发展,越来越多的技术(例如:云计算、大数据或区块链)应用在金融领域,传统金融业正在逐步向金融科技转变。例如,银行可基于服务端为客户端提供服务的系统架构,构建相关的金融产品并部署于服务端上,从而用户通过自己日常携带的终端就可以便捷地对一些金融类的业务进行办理,提升了用户体验。
其中,服务端在接收到用户请求后,可根据用户请求中的路由参数,执行接口的对应实现方法,以对用户请求进行处理。例如,目前在对用户请求进行处理时,可通过工厂设计模式实现。具体的,工厂设计模式可根据前端传入的路由参数,返回同个接口的不同实现类的实例,进而达到执行对应方法的效果。如图1所示,为现有技术提供的一种工厂设计模式的开发流程图。基于图1可知,在接口开发过程中,若采用工厂设计模式,则需要为每一个接口编写工厂类,显然使得开发与维护工作变得繁琐;此外,在所开发的接口被调用的过程中,则需要首先手动地从请求中获取路由参数,随后显式地获取实例,显然成本较高。
发明内容
本申请提供一种请求处理方法及装置,用以简化接口开发与维护的繁琐程度,以及在对请求进行处理时尽可能对控制器做到透明。
第一方面,本申请实施例提供一种请求处理方法,适用于Spring开源框架;该方法包括:针对接收的业务请求,确定所述业务请求对应的接口;若确定所述接口中注入的是动态代理对象,则通过所述业务请求中的路由参数和所述接口的接口信息,从预设路由关系中确定所述接口的第一实现类;其中,动态代理对象是Spring容器基于建模对象BeanDefinition中的工厂对象FactoryBean实例化得到的;所述预设路由关系设置有路由参数+接口信息与实现类的映射关系;通过所述第一实现类的实例对所述业务请求进行处理。
上述方案中,通过使用注解技术描述路由关系,基于动态代理,对实现对象的调用进行路由,无需为每一个接口编写一个工厂类;以及,通过替换控制器注入的服务接口为动态代理对象,实现了对接口调用者的尽可能透明。
在一种可能实现的方法中,所述动态代理对象是Spring容器基于建模对象BeanDefinition中的工厂对象FactoryBean实例化得到的,包括:针对任一接口,若所述接口设置有接口注解,则将所述接口的BeanDefinition指示的对象Bean的实现类修改为FactoryBean,并向所述FactoryBean传入所述接口的接口信息;所述FactoryBean用于实例化所述Bean得到所述接口的动态代理对象。
上述方案中,通过将设置有接口注解的接口的BeanDefinition指示的对象Bean的实现类修改为FactoryBean,并向FactoryBean中传入该接口的接口信息,从而在Spring容器实例化Bean的时候,就可以使用FactoryBean来实例化Bean,从而得到该接口的动态代理对象。基于动态代理对象对业务请求进行处理,就可以对控制器做到尽可能透明。
在一种可能实现的方法中,所述FactoryBean用于实例化所述Bean得到所述接口的动态代理对象,包括:设置所述BeanDefinition中的Primary参数的启用状态;Spring容器在实例化所述Bean时,基于所述Primary参数的启用状态,通过所述FactoryBean实例化所述Bean得到所述接口的动态代理对象。
上述方案中,在Spring容器实例化Bean之前,通过将BeanDefinition中的Primary参数设置为启用状态,则在实例化Bean时,Spring容器可使用FactoryBean来实例化Bean时,也即可以向Spring容器中注入接口的动态代理对象,而不再是基于BeanDefinition来注入具体的实现Bean。
在一种可能实现的方法中,通过如下方式确定所述接口是否设置有接口注解,包括:Spring容器在接收到启动指令后,通过包扫描技术遍历各BeanDefinition;针对任一BeanDefinition,确定所述BeanDefinition指示的Bean是否对应接口及是否有接口注解;若确定所述BeanDefinition指示的Bean未对应接口,则确定所述BeanDefinition指示的Bean对应的实现类是否包括类注解。
上述方案中,对于一个接口对应至少两个实现类的场景,通过为接口以及实现类添加注解,从而在Spring容器启动过程中,通过包扫描技术,就可以确定源代码中各BeanDefinition指示的Bean是否对应接口或实现类,并在确定是对应接口或者是对应实现类时,进一步判定接口或者实现类是否具有接口注解或者类注解,如此,为接下来建立路由关系以及更改接口注解所在接口的BeanDefinition的各实现类奠定基础。
在一种可能实现的方法中,所述预设路由关系是通过如下方式得到的,包括:针对任一实现类,若所述实现类设置有类注解,则遍历所述实现类所实现的各接口;针对各接口中任一接口,若所述接口设置有接口注解,则构建所述接口与所述实现类的路由关系;所述接口与所述实现类的路由关系设置有所述类注解中携带的路由参数+所述接口的接口信息与所述实现类的映射关系。
上述方案中,通过遍历实现类,并对设置有类注解的实现类所实现的各接口进行遍历,若一接口设置有接口注解,则可以构建当前接口与当前实现类路由关系,其中路由关系中包括接口与实现类的对应关系以及类注解中携带的路由参数与实现类的对应关系;基于所构建的路由关系,当在对用户请求进行响应时,就可以快速基于路由参数与接口信息定位到对应的实现类,最后通过调用实现类对应的方法,就可以对用户请求进行处理。
在一种可能实现的方法中,所述动态代理对象通过如下方式得到所述业务请求中的路由参数,包括:通过面向切面编程AOP,将所述业务请求中的路由参数保存于线程局部变量ThreadLocal中;所述动态代理对象从所述ThreadLocal中获取所述业务请求中的路由参数。
上述方案中,通过AOP技术保存路由参数至ThreadLocal中,则可以避免在控制器的每个方法中都编写路由字段的获取逻辑。
在一种可能实现的方法中,若确定所述接口中注入的是实现对象,则获取所述接口的第二实现类;所述实现对象是所述Spring容器基于BeanDefinition实例化得到的,所述接口与所述第二实现类一一对应;通过所述第二实现类的实例对所述业务请求进行处理。
上述方案中,对于一个接口仅对应一个实现类的场景,在Spring容器启动过程中,通过包扫描技术,若确定某接口仅对应一个实现类,则无需建立该接口与实现类的路由关系,且在Spring容器实例化Bean的过程中,Spring容器可直接基于BeanDefinition实例化出一个具体的实现Bean,即实现对象。该方式下,在用户请求进入时,可直接基于实现对象指向的第二实现类来对用户请求进行处理。
第二方面,本申请实施例提供一种请求处理装置,适用于Spring开源框架;该装置包括:接口确定单元,用于针对接收的业务请求,确定所述业务请求对应的接口;实现类确定单元,用于若确定所述接口中注入的是动态代理对象,通过所述业务请求中的路由参数和所述接口的接口信息,从预设路由关系中确定所述接口的第一实现类;其中,动态代理对象是Spring容器基于建模对象BeanDefinition中的工厂对象FactoryBean实例化得到的;所述预设路由关系设置有路由参数+接口信息与实现类的映射关系;处理单元,用于通过所述第一实现类的实例对所述业务请求进行处理。
第三方面,本申请实施例提供了一种计算设备,包括:
存储器,用于存储程序指令;
处理器,用于调用所述存储器中存储的程序指令,按照获得的程序执行如第一方面任一实现方法。
第四方面,本申请实施例提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机可执行指令,所述计算机可执行指令用于使计算机执行如第一方面任一实现方法。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为现有技术提供的一种工厂设计模式的开发流程图;
图2为本申请实施例提供的一种请求处理方法的示意图;
图3为本申请实施例提供的一种Spring容器初始化的流程图;
图4为本申请实施例提供的一种路由关系配置示意图;
图5为本申请实施例提供的一种请求处理装置的示意图;
图6为本申请实施例提供的一种计算设备的示意图。
具体实施方式
为了使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请作进一步地详细描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本申请保护的范围。
目前,服务端可基于工厂设计模式,而为各个接口编写不同的实现类,从而在服务端对用户请求进行响应时,其可根据前端传入参数、返回同个接口的不同实现类的实例,进而达到执行对应方法的效果。
然而上述方法在接口开发的过程中,由于需要为每一个接口编写工厂类,因而存在开发、维护繁琐的缺点,以及,在接口调用时首先需要手动获取路由参数,接着向工厂中传入路由参数以获取实例,最后再对实例进行调用方能执行对应方法,因此存在对接口调用者不够透明的缺点。
针对上述技术问题,本申请实施例提供一种请求处理方法,适用于Spring框架。如图2所示,为本申请实施例提供的一种请求处理方法的示意图,该方法包括以下步骤:
步骤201,针对接收的业务请求,确定所述业务请求对应的接口;
步骤202,若确定所述接口中注入的是动态代理对象,则通过所述业务请求中的路由参数和所述接口的接口信息,从预设路由关系中确定所述接口的第一实现类;其中,动态代理对象是Spring容器基于建模对象BeanDefinition中的工厂对象FactoryBean实例化得到的;所述预设路由关系设置有路由参数+接口信息与实现类的映射关系;
步骤203,通过所述第一实现类的实例对所述业务请求进行处理。
上述方案中,通过使用注解技术描述路由关系,基于动态代理,对实现对象的调用进行路由,无需为每一个接口编写一个工厂类;以及,通过替换控制器注入的服务接口为动态代理对象,实现了对接口调用者的尽可能透明。
以下将结合示例分别对上述一些步骤进行详细说明。
在本申请的某些实施中,Spring容器在接收到启动指令后,通过包扫描技术遍历各BeanDefinition;针对任一BeanDefinition,确定所述BeanDefinition指示的Bean是否对应接口及是否有接口注解;若确定所述BeanDefinition指示的Bean未对应接口,则确定所述BeanDefinition指示的Bean对应的实现类是否包括类注解。
在本申请的某些实施中,针对任一实现类,若所述实现类设置有类注解,则遍历所述实现类所实现的各接口;针对各接口中任一接口,若所述接口设置有接口注解,则构建所述接口与所述实现类的路由关系;所述接口与所述实现类的路由关系设置有所述类注解中携带的路由参数+所述接口的接口信息与所述实现类的映射关系。
在本申请实施例中,以服务端采用Spring开源框架为例进行说明。此外,本申请实施例中可设计有接口注解和类注解,作为示例,可将接口注解表示为@RouteInterface,以及将类注解表示为@RouteImpl,所设计的这两个注解分别修饰在接口和实现类上,其中注解@RouteImpl中会携带设定路由参数。通过这两个注解,可以描述一种路由关系,即当用户请求中包含设定路由参数,并调用@RouteInterface注解的接口时,那么实际上会调用到@RouteImpl注解中与设定路由参数相同的实现类。本申请实施例中对于路由关系的建立,可在Spring容器初始化时,利用包扫描技术读取注解,以进行路由关系的建立。具体内容如下:
路由关系是在Spring容器启动的生命周期BeanDefinitionRegistryPostProcessor中建立的。其中,包扫描遍历源代码中所有的实现类,当遇到带有@RouteImpl注解的实现类α时,读取注解中的路由参数β,并遍历该实现类所实现的各接口;当存在该实现类所实现的接口γ带有@RouteInterface注解时,则建立路由关系(β,γ)->α。
在本申请的某些实施中,针对任一接口,若所述接口设置有接口注解,则将所述接口的BeanDefinition指示的对象Bean的实现类修改为FactoryBean,并向所述FactoryBean传入所述接口的接口信息;所述FactoryBean用于实例化所述Bean得到所述接口的动态代理对象。
在本申请的某些实施中,所述FactoryBean用于实例化所述Bean得到所述接口的动态代理对象,包括:设置所述BeanDefinition中的Primary参数的启用状态;Spring容器在实例化所述Bean时,基于所述Primary参数的启用状态,通过所述FactoryBean实例化所述Bean得到所述接口的动态代理对象。
在Spring容器初始化过程中,除了需要建立路由关系,还需要注册动态代理对象Bean到Spring容器中。其中,注册动态代理对象Bean到Spring容器中同样是在Spring容器启动的生命周期BeanDefinitionRegistryPostProcessor中进行的,由于该生命周期处于Spring实例化Bean之前,因此此时,仍允许对BeanDefinition进行修改。具体的,在注册动态代理对象Bean到Spring容器中时,同样可利用包扫描技术进行遍历,不过本次包扫描将遍历源代码中所有的接口,当遇到带有@RouteInterface注解的接口γ时,将其BeanDefinition中的各实现类一一修改为工厂对象FactoryBean,并向FactoryBean中传入接口名,即γ,同时设置Primary参数为启用。从而当Spring对Bean实例化时,就会基于FactoryBean实例化出接口γ的动态代理对象。
对于上述描述的对路由关系进行建立的这一过程以及注册动态代理对象Bean到Spring容器中的这一过程,可以通过图3所示的Spring容器初始化的流程图进行直观展示。如图3所示,为本申请实施例提供的一种Spring容器初始化的流程图,包括以下步骤:
步骤301,Spring容器初始化开始。
步骤302,包扫描遍历BeanDefinition。
步骤303,确定当前BeanDefinition指示的Bean对应接口或实现类。若确定对应接口,则执行步骤304;若确定对应实现类,则执行步骤306。
步骤304,确定当前接口γ是否包含注解@RouteInterface。若确定包含,则执行步骤305,否则执行步骤310。
步骤305,将接口γ对应的实现类修改为工厂对象FactoryBean,并向FactoryBean中传入接口名γ,并执行步骤310。
步骤306,确定当前实现类α是否包含注解@RouteImpl。若确定包含,则执行步骤307,否则执行步骤310。
步骤307,遍历实现类α所实现的接口。
步骤308,确定当前接口γ是否包含注解@RouteInterface。若确定包含,则执行步骤309,否则执行步骤310。
步骤309,读取@RouteImpl中的路由参数β,以建立路由关系(β,γ)->α,并执行步骤310。
步骤310,确定包扫描是否结束。若确定未结束,则重新执行步骤302-310,否则执行步骤311。
步骤311,Spring容器初始化结束。
下面是对图3所示的流程图的一些说明。
首先,图3所示的流程图对应的操作发生于Spring生命周期的BeanDefinitionRegistryPostProcessor中。其中,在该生命周期中,是允许对BeanDefinition进行修改的。
其次,步骤302的包扫描可通过继承并扩展ClassPathBeanDefinitionScanner类实现,该类会通过配置的包路径在ClassPath中扫描BeanDefinition。BeanDefinition中会提供类的metadata。由于metadata中包含Bean实现类的接口属性、注解信息等详细参数,因此包扫描过程中将可以根据metadata完成步骤303、步骤304、步骤306和步骤308的分支判断。
此外,通过步骤304和305,可对带有注解@RouteInterface的接口γ的BeanDefinition进行修改并注册到Spring容器中。具体的,接口γ的BeanDefinition中的各实现类将被一一修改为工厂对象FactoryBean,如此FactoryBean可在实例化时产生一个实现接口γ的动态代理对象,从而在调用此对象的方法时,动态代理对象可根据路由参数和路由关系找到具体的实现bean,并调用该bean的同名方法。同时,可将工厂对象FactoryBean的BeanDefinition的Primary参数设置为高优先级;从而在Spring容器实例化Bean时,具体为在@Autowired注入带有@RouteInterface注解的接口时,由于优先级的关系,所注入的将是动态代理对象,而不再是具体的实现Bean。
最后,路由关系的获取可通过步骤306-309完成,也即在对带有@RouteImpl注解的实现类进行反射获取其接口信息并取出注解中的路由参数,逐个接口判断是否附带@RouteInterface注解,若能够找到,则可建立一条路由关系。
基于以上描述的动态代理的对象调用路由的流程图,本申请实施例不再需要开发和维护工厂来处理路由参数与实现类的关系,此外调用者也不需要重复地在方法中根据路由参数来获得实现类,而是通过使用由Spring注入的动态代理对象即可。
作为示例,接下来以一个具体的例子进行Spring容器初始化的说明。
如图4所示,为本申请实施例提供的一种路由关系配置示意图。设工程师基于各业务的处理逻辑、配置了如图4所示的接口-实现类的对应关系。在图4中,上面一行表示实现类,设包括有4个实现类,分别记作A1、A2、A3和A4;下面一行表示接口,设包括有6个接口,分别记作C1、C2、C3、C4、C5和C6。
其中,通过对图4所示的接口-实现类的对应关系的观察可知,当中包括以下两种情况:
情况1,一个接口对应至少两个实现类。如接口C2对应A1和A2两个实现类,接口C4对应A2、A3和A4三个实现类。
情况2,一个接口仅对应唯一的一个实现类。如接口C1、C3、C5和C6分别仅对应一个实现类,分别为A1、A2、A4和A3。
则,基于图4所示的接口-实现类的对应关系,工程师将在接口C2和接口C4上分别修饰有接口注解@RouteInterface,以及在A1、A2、A3和A4分别修饰有类注解@RouteImpl,但并不会在接口C1、C3、C5和C6上分别修饰接口注解@RouteInterface。那么:
在Spring容器初始化时,一方面,通过包扫描技术,当在对各实现类进行遍历并设遍历到实现类A1时,由于A1上修饰有注解@RouteImpl,那么可继续遍历A1所实现的各接口;其中,当遍历到接口C2时,由于C2上修饰有注解@RouteInterface,则可以建立一条路由关系:(βA1,γC2)->αA1。
其中,βA1表示实现类A1的注解@RouteImpl中包括的路由参数,γC2表示C2这一带有@RouteInterface注解的接口,αA1数表示A1这一带有@RouteImpl注解的实现类。
同理,在包扫描结束后,共可获取5条路由关系,分别为:(βA1,γC2)->αA1、(βA2,γC2)->αA2、(βA2,γC4)->αA2、(βA3,γC4)->αA3和(βA4,γC4)->αA4。
但,对于图4中的C1这一接口,由于其仅对应A1这一个实现类,并未被修饰有注解@RouteInterface,故在包扫描结束后,则无需建立C1-A1这一路径之间的路由关系。接口C3、C5和C6与C1同理。
另一方面,在Spring容器初始化时,通过包扫描技术,当在对各接口进行遍历并设遍历到接口C2时,由于C2上修饰有注解@RouteInterface,则可以将其BeanDefinition中的各实现类修改为工厂对象FactoryBean,并向FactoryBean传入接口C2的名称,同时将FactoryBean在BeanDefinition中的Primary参数设置为启用状态,从而在包扫描结束后,Spring容器对Bean进行实例化时,Spring容器关于接口C2注入的是动态代理对象,而不再是具体的实现Bean。例如,当遍历到修饰有注解@RouteInterface的接口C2时,接口C2对应的BeanDefinition中将包括有两个实现类,分别为实现类A1和A2,其中,针对于每一个实现类,如针对A1,可以将A1修改为工厂对象FactoryBean_A1,并向FactoryBean_A1传入接口C2的名称,同时将FactoryBean_A1在BeanDefinition中的Primary参数设置为启用状态,从而在包扫描结束后,Spring容器对Bean进行实例化时,Spring容器关于接口C2、实现类A1注入的是动态代理对象,而不再是具体的实现Bean。
但,对于遍历到接口C1时,由于C1上未修饰有注解@RouteInterface,则无需将其BeanDefinition中的唯一实现类修改为工厂对象FactoryBean;且,对于该种情况,在包扫描结束后,Spring容器对Bean进行实例化时,Spring容器关于接口C1、实现类A1注入的将是具体的实现Bean。
在本申请的某些实施中,通过面向切面编程AOP,将所述业务请求中的路由参数保存于线程局部变量ThreadLocal中;所述动态代理对象从所述ThreadLocal中获取所述业务请求中的路由参数。
运行时动态代理对象需要依据路由参数和路由关系确定实现类。由于Spring容器启动过程获取了路由关系,接下来需要获取路由参数。路由参数会包含路由字段。为避免在控制器的每个方法中都编写路由字段获取逻辑,本申请实施例中采用AOP技术处理用户请求,统一将路由参数保存于ThreadLocal。
在控制器中注入指定服务接口,即带有接口注解的接口时,会因为BeanDefinition被修改,以及Primary参数带来的优先级关系,实际上注入的是动态代理对象。控制器处理客户请求过程中会调用服务接口中的方法,此时交由动态代理对象处理。动态代理对象中保存着原接口信息γ,并从ThreadLocal中取出路由参数β,根据路由规则(β,γ)->α得到实现对象,通过反射技术调用同名方法。
例如,基于图4所示的接口-实现类的对应关系,设接收到的业务请求对应的接口为C2时,由于C2被配置有A1和A2两个实现类,因此C2上被修饰有注解@RouteInterface,从而说明Spring容器在对Bean进行实例化时,Spring容器关于接口C2注入的是动态代理对象;此时假设该动态代理对象关于该业务请求保存于ThreadLocal中的路由参数获取到的是βA1,则表示该动态代理对象可根据路由参数βA1和路由关系(βA1,γC2)->αA1找到具体的实现bean,并调用该bean的同名方法来对该业务请求进行处理。
在本申请的某些实施中,若确定所述接口中注入的是实现对象,获取所述接口的第二实现类;所述实现对象是所述Spring容器基于BeanDefinition实例化得到的,所述接口与所述第二实现类一一对应;通过所述第二实现类的实例对所述业务请求进行处理。
对于一业务请求,若该业务请求对应的接口并非为在控制器中注入的指定服务接口,即该接口并不带有接口注解,那么可因为该接口实例化过程中实际上注入的是具体的实现Bean,控制器可直接调用与实现Bean对应的实现类来对该业务请求进行处理。
例如,基于图4所示的接口-实现类的对应关系,设接收到的业务请求对应的接口为C1时,由于C1仅被配置有A1一个实现类,因此C1上未被修饰有注解@RouteInterface,从而说明Spring容器在对Bean进行实例化时,Spring容器关于接口C1注入的是具体的实现Bean(实现对象),因此控制器可直接调用接口C1的实现类(即A1)的实例来对业务请求进行处理。
基于同样的构思,本申请实施例提供一种请求处理装置,适用于Spring开源框架。如图5所示,为本申请实施例提供的一种请求处理装置的示意图,该装置包括接口确定单元501、实现类确定单元502和处理单元503;
接口确定单元501,用于针对接收的业务请求,确定所述业务请求对应的接口;
实现类确定单元502,用于若确定所述接口中注入的是动态代理对象,通过所述业务请求中的路由参数和所述接口的接口信息,从预设路由关系中确定所述接口的第一实现类;其中,动态代理对象是Spring容器基于建模对象BeanDefinition中的工厂对象FactoryBean实例化得到的;所述预设路由关系设置有路由参数+接口信息与实现类的映射关系;
处理单元503,用于通过所述第一实现类的实例对所述业务请求进行处理。
进一步的,对于该装置,还包括动态代理对象生成单元504;动态代理对象生成单元504,用于:针对任一接口,若所述接口设置有接口注解,则将所述接口的BeanDefinition指示的对象Bean的实现类修改为FactoryBean,并向所述FactoryBean传入所述接口的接口信息;所述FactoryBean用于实例化所述Bean得到所述接口的动态代理对象。
进一步的,对于该装置,动态代理对象生成单元504,具体用于:设置所述BeanDefinition中的Primary参数的启用状态;Spring容器在实例化所述Bean时,基于所述Primary参数的启用状态,通过所述FactoryBean实例化所述Bean得到所述接口的动态代理对象。
进一步的,对于该装置,还包括注解确定单元505;注解确定单元505,用于:Spring容器在接收到启动指令后,通过包扫描技术遍历各BeanDefinition;针对任一BeanDefinition,确定所述BeanDefinition指示的Bean是否对应接口及是否有接口注解;若确定所述BeanDefinition指示的Bean未对应接口,则确定所述BeanDefinition指示的Bean对应的实现类是否包括类注解。
进一步的,对于该装置,还包括路由关系获取单元506;路由关系获取单元506,用于:针对任一实现类,若所述实现类设置有类注解,则遍历所述实现类所实现的各接口;针对各接口中任一接口,若所述接口设置有接口注解,则构建所述接口与所述实现类的路由关系;所述接口与所述实现类的路由关系设置有所述类注解中携带的路由参数+所述接口的接口信息与所述实现类的映射关系。
进一步的,对于该装置,还包括路由参数获取单元507;路由参数获取单元507,用于:通过面向切面编程AOP,将所述业务请求中的路由参数保存于线程局部变量ThreadLocal中;所述动态代理对象从所述ThreadLocal中获取所述业务请求中的路由参数。
进一步的,对于该装置,实现类确定单元502,还用于:若确定所述接口中注入的是实现对象,获取所述接口的第二实现类;所述实现对象是所述Spring容器基于BeanDefinition实例化得到的,所述接口与所述第二实现类一一对应;处理单元,还用于通过所述第二实现类的实例对所述业务请求进行处理。
本申请实施例还提供了一种计算设备,该计算设备具体可以为桌面计算机、便携式计算机、智能手机、平板电脑、个人数字助理(Personal Digital Assistant,PDA)等。该计算设备可以包括中央处理器(Center Processing Unit,CPU)、存储器、输入/输出设备等,输入设备可以包括键盘、鼠标、触摸屏等,输出设备可以包括显示设备,如液晶显示器(Liquid Crystal Display,LCD)、阴极射线管(Cathode Ray Tube,CRT)等。
存储器,可以包括只读存储器(ROM)和随机存取存储器(RAM),并向处理器提供存储器中存储的程序指令和数据。在本申请实施例中,存储器可以用于存储请求处理方法的程序指令;
处理器,用于调用所述存储器中存储的程序指令,按照获得的程序执行请求处理方法。
如图6所示,为本申请实施例提供的一种计算设备的示意图,该计算设备包括:
处理器601、存储器602、收发器603、总线接口604;其中,处理器601、存储器602与收发器603之间通过总线605连接;
所述处理器601,用于读取所述存储器602中的程序,执行上述请求处理方法;
处理器601可以是中央处理器(central processing unit,简称CPU),网络处理器(network processor,简称NP)或者CPU和NP的组合。还可以是硬件芯片。上述硬件芯片可以是专用集成电路(application-specific integrated circuit,简称ASIC),可编程逻辑器件(programmable logic device,简称PLD)或其组合。上述PLD可以是复杂可编程逻辑器件(complex programmable logic device,简称CPLD),现场可编程逻辑门阵列(field-programmable gate array,简称FPGA),通用阵列逻辑(generic array logic,简称GAL)或其任意组合。
所述存储器602,用于存储一个或多个可执行程序,可以存储所述处理器601在执行操作时所使用的数据。
具体地,程序可以包括程序代码,程序代码包括计算机操作指令。存储器602可以包括易失性存储器(volatile memory),例如随机存取存储器(random-access memory,简称RAM);存储器602也可以包括非易失性存储器(non-volatile memory),例如快闪存储器(flash memory),硬盘(hard disk drive,简称HDD)或固态硬盘(solid-state drive,简称SSD);存储器602还可以包括上述种类的存储器的组合。
存储器602存储了如下的元素,可执行模块或者数据结构,或者它们的子集,或者它们的扩展集:
操作指令:包括各种操作指令,用于实现各种操作。
操作系统:包括各种系统程序,用于实现各种基础业务以及处理基于硬件的任务。
总线605可以是外设部件互连标准(peripheral component interconnect,简称PCI)总线或扩展工业标准结构(extended industry standard architecture,简称EISA)总线等。总线可以分为地址总线、数据总线、控制总线等。为便于表示,图6中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
总线接口604可以为有线通信接入口,无线总线接口或其组合,其中,有线总线接口例如可以为以太网接口。以太网接口可以是光接口,电接口或其组合。无线总线接口可以为WLAN接口。
本申请实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机可执行指令,所述计算机可执行指令用于使计算机执行请求处理方法。
本领域内的技术人员应明白,本申请的实施例可提供为方法、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。
显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。
Claims (10)
1.一种请求处理方法,其特征在于,适用于Spring开源框架;所述方法包括:
针对接收的业务请求,确定所述业务请求对应的接口;
若确定所述接口中注入的是动态代理对象,则通过所述业务请求中的路由参数和所述接口的接口信息,从预设路由关系中确定所述接口的第一实现类;其中,动态代理对象是Spring容器基于建模对象BeanDefinition中的工厂对象FactoryBean实例化得到的;所述预设路由关系设置有路由参数+接口信息与实现类的映射关系;
通过所述第一实现类的实例对所述业务请求进行处理。
2.如权利要求1所述的方法,其特征在于,
所述动态代理对象是Spring容器基于建模对象BeanDefinition中的工厂对象FactoryBean实例化得到的,包括:
针对任一接口,若所述接口设置有接口注解,则将所述接口的BeanDefinition指示的对象Bean的实现类修改为FactoryBean,并向所述FactoryBean传入所述接口的接口信息;所述FactoryBean用于实例化所述Bean得到所述接口的动态代理对象。
3.如权利要求2所述的方法,其特征在于,所述FactoryBean用于实例化所述Bean得到所述接口的动态代理对象,包括:
设置所述BeanDefinition中的Primary参数的启用状态;
Spring容器在实例化所述Bean时,基于所述Primary参数的启用状态,通过所述FactoryBean实例化所述Bean得到所述接口的动态代理对象。
4.如权利要求2所述的方法,其特征在于,通过如下方式确定所述接口是否设置有接口注解,包括:
Spring容器在接收到启动指令后,通过包扫描技术遍历各BeanDefinition;针对任一BeanDefinition,确定所述BeanDefinition指示的Bean是否对应接口及是否有接口注解;
若确定所述BeanDefinition指示的Bean未对应接口,则确定所述BeanDefinition指示的Bean对应的实现类是否包括类注解。
5.如权利要求1所述的方法,其特征在于,
所述预设路由关系是通过如下方式得到的,包括:
针对任一实现类,若所述实现类设置有类注解,则遍历所述实现类所实现的各接口;
针对各接口中任一接口,若所述接口设置有接口注解,则构建所述接口与所述实现类的路由关系;所述接口与所述实现类的路由关系设置有所述类注解中携带的路由参数+所述接口的接口信息与所述实现类的映射关系。
6.如权利要求1-5任一项所述的方法,其特征在于,
所述动态代理对象通过如下方式得到所述业务请求中的路由参数,包括:
通过面向切面编程AOP,将所述业务请求中的路由参数保存于线程局部变量ThreadLocal中;
所述动态代理对象从所述ThreadLocal中获取所述业务请求中的路由参数。
7.如权利要求1所述的方法,其特征在于,所述方法还包括:
若确定所述接口中注入的是实现对象,则获取所述接口的第二实现类;所述实现对象是所述Spring容器基于BeanDefinition实例化得到的,所述接口与所述第二实现类一一对应;
通过所述第二实现类的实例对所述业务请求进行处理。
8.一种请求处理装置,其特征在于,适用于Spring开源框架;所述装置包括:
接口确定单元,用于针对接收的业务请求,确定所述业务请求对应的接口;
实现类确定单元,用于若确定所述接口中注入的是动态代理对象,则通过所述业务请求中的路由参数和所述接口的接口信息,从预设路由关系中确定所述接口的第一实现类;其中,动态代理对象是Spring容器基于建模对象BeanDefinition中的工厂对象FactoryBean实例化得到的;所述预设路由关系设置有路由参数+接口信息与实现类的映射关系;
处理单元,用于通过所述第一实现类的实例对所述业务请求进行处理。
9.一种计算机设备,其特征在于,包括:
存储器,用于存储计算机程序;
处理器,用于调用所述存储器中存储的计算机程序,按照获得的程序执行如权利要求1-7任一项所述的方法。
10.一种计算机可读存储介质,其特征在于,所述存储介质存储有计算机可执行指令,所述计算机可执行指令用于使计算机执行如权利要求1-7任一项所述的方法。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111461675.2A CN114090193A (zh) | 2021-12-03 | 2021-12-03 | 一种请求处理方法及装置 |
PCT/CN2022/120218 WO2023098241A1 (zh) | 2021-12-03 | 2022-09-21 | 一种请求处理方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111461675.2A CN114090193A (zh) | 2021-12-03 | 2021-12-03 | 一种请求处理方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114090193A true CN114090193A (zh) | 2022-02-25 |
Family
ID=80306547
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111461675.2A Pending CN114090193A (zh) | 2021-12-03 | 2021-12-03 | 一种请求处理方法及装置 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN114090193A (zh) |
WO (1) | WO2023098241A1 (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2023098241A1 (zh) * | 2021-12-03 | 2023-06-08 | 深圳前海微众银行股份有限公司 | 一种请求处理方法及装置 |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116795426B (zh) * | 2023-08-21 | 2023-11-10 | 智慧眼科技股份有限公司 | 一种数据处理方法及系统 |
CN117056317B (zh) * | 2023-10-11 | 2024-01-26 | 腾讯科技(深圳)有限公司 | 数据处理方法、装置、设备及计算机可读存储介质 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6877163B1 (en) * | 1999-06-14 | 2005-04-05 | Sun Microsystems, Inc. | Method and system for dynamic proxy classes |
CN100373332C (zh) * | 2004-11-28 | 2008-03-05 | 中兴通讯股份有限公司 | 构建耦合系统的方法 |
CN111259067B (zh) * | 2020-01-21 | 2023-06-06 | 褚晶晶 | 一种基于Spring实现DAO接口的方法、装置及设备 |
CN111831365A (zh) * | 2020-07-29 | 2020-10-27 | 中国平安财产保险股份有限公司 | 接口路由转发方法、系统、计算机设备及可读存储介质 |
CN114090193A (zh) * | 2021-12-03 | 2022-02-25 | 深圳前海微众银行股份有限公司 | 一种请求处理方法及装置 |
-
2021
- 2021-12-03 CN CN202111461675.2A patent/CN114090193A/zh active Pending
-
2022
- 2022-09-21 WO PCT/CN2022/120218 patent/WO2023098241A1/zh unknown
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2023098241A1 (zh) * | 2021-12-03 | 2023-06-08 | 深圳前海微众银行股份有限公司 | 一种请求处理方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
WO2023098241A1 (zh) | 2023-06-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN114090193A (zh) | 一种请求处理方法及装置 | |
US20220222070A1 (en) | Techniques to deploy an application as a cloud computing service | |
US10579344B2 (en) | Converting visual diagrams into code | |
US20220035544A1 (en) | Memory allocation method and device, and electronic apparatus | |
JP2020502621A (ja) | ブロックチェーンネットワーク用テストプラットフォーム | |
CN111026634A (zh) | 一种接口自动化测试系统、方法、装置及存储介质 | |
WO2021238596A1 (zh) | 接口调用方法、装置和计算机可读存储介质 | |
CN109344062A (zh) | 页面跨域跳转测试的方法及终端设备 | |
US10310863B1 (en) | Patching functions in use on a running computer system | |
EP4078379A1 (en) | Virtual workspace experience visualization and optimization | |
CN113986424A (zh) | 一种页面显示方法及装置 | |
US9329897B2 (en) | Use of dynamic profiles for creating and using a distributed computing environment | |
CN116662039B (zh) | 基于共享内存的工业信息并行检测方法、装置及介质 | |
WO2021057811A1 (zh) | 网络节点处理方法、装置、存储介质及电子设备 | |
CN113448570A (zh) | 数据处理方法、装置、电子设备及存储介质 | |
CN111127616B (zh) | 一种渲染校验方法及装置 | |
US20190171989A1 (en) | Dynamic Workflow Control Based on Database Logic | |
US10338891B2 (en) | Migration between model elements of different types in a modeling environment | |
CN115495188A (zh) | 混合开发app的主题颜色切换方法、装置、设备及介质 | |
CN112052171B (zh) | 测试报文处理方法、装置、计算机设备及存储介质 | |
CN114936152A (zh) | 应用测试方法及设备 | |
CN110515834A (zh) | 接口测试方法、装置、移动终端及存储介质 | |
CN112367205A (zh) | 一种对http调度请求的处理方法及调度系统 | |
US11758012B1 (en) | Computer service invocation chain monitoring and remuneration optimization | |
US11853722B2 (en) | Automatically validating design parameters for enterprise applications |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination |