CN114237774A - 一种解除功能模块依赖的内部调用方法 - Google Patents

一种解除功能模块依赖的内部调用方法 Download PDF

Info

Publication number
CN114237774A
CN114237774A CN202210133135.XA CN202210133135A CN114237774A CN 114237774 A CN114237774 A CN 114237774A CN 202210133135 A CN202210133135 A CN 202210133135A CN 114237774 A CN114237774 A CN 114237774A
Authority
CN
China
Prior art keywords
interface
module
calling
internal
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.)
Granted
Application number
CN202210133135.XA
Other languages
English (en)
Other versions
CN114237774B (zh
Inventor
王帅
张大伟
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Huayu Shuguan Technology Co ltd
Original Assignee
Beijing Unita Information Technology Co ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing Unita Information Technology Co ltd filed Critical Beijing Unita Information Technology Co ltd
Priority to CN202210133135.XA priority Critical patent/CN114237774B/zh
Publication of CN114237774A publication Critical patent/CN114237774A/zh
Application granted granted Critical
Publication of CN114237774B publication Critical patent/CN114237774B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4488Object-oriented
    • G06F9/449Object-oriented method invocation or resolution
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/71Version control; Configuration management

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Security & Cryptography (AREA)
  • Stored Programmes (AREA)

Abstract

本发明公开一种解除功能模块依赖的内部调用方法,构建一个内部调用模块,将功能模块与业务模块通过内部调用模块通信连接。本发明通过在功能模块与业务模块之间增设内部调用模块,实现功能模块与业务模块之间的依赖关系解除,同时还可以保证业务模块可以对功能模块的调用。

Description

一种解除功能模块依赖的内部调用方法
技术领域
本发明涉及软件架构、功能实现、代码复用技术领域。具体地说是一种解除功能模块依赖的内部调用方法。
背景技术
使用java语言基于spring框架开发应用时,通常使用模块化程序设计来完成应用开发。功能模块简单来书是指数据说明、可执行语句等程序元素的集合,它是指单独命名的可通过名字来访问的过程、函数、子程序或宏调用。功能模块化是将程序划分成若干个功能模块,每个功能模块完成了一个子功能,并在这些模块之间建立必要的联系,通过模块的互相协作完成整个功能的程序设计方法,以满足所要求的整个应用的功能。
模块化程序设计有很多优点,但相对的,对模块的独立、规模、层次等分解也会有很大难度。普遍的是,一个功能模块在功能设计上是独立的,但在开发和使用中会依赖很多其它功能模块,从而导致开发与测试困难。单体应用随着体量原来越大,功能模块越来越多,功能模块的耦合严重、可靠性差等问题也开始显现出来。
应用设计时,在应用场景固定的情况下,结合用户量、数据量等因素,从而选择使用单体或者分布式的架构,但以产品的形式是无法满足的。因为产品开发完成后,功能是固定的,但是客户的情况是不固定的,从而导致用户量、数据量等因素也不固定。此时我们无法选择将应用以单体或微服务的方式开发与部署。
发明内容
为此,本发明所要解决的技术问题在于提供一种解除功能模块依赖的内部调用方法,通过在功能模块与业务模块之间增设内部调用模块,实现功能模块与业务模块之间的依赖关系解除,同时还可以保证业务模块可以对功能模块的调用。
为解决上述技术问题,本发明提供如下技术方案:
一种解除功能模块依赖的内部调用方法,构建一个内部调用模块,将功能模块与业务模块通过内部调用模块通信连接。
上述解除功能模块依赖的内部调用方法,构建一个启动模块,将所有功能模块或上述功能模块使用时所属依赖的方法引入启动模块内,将启动模块与内部调用模块通信连接。
上述解除功能模块依赖的内部调用方法,在内部调用模块内进行如下处理:
a1)创建在启动类上使用的开启内部调节用注解,所述开启内部调节用注解用于控制是否开启内部调用方法;
a2) 创建作用在接口上的声明内部调用接口注解,声明内部调用接口注解至少包括真实调用对象的类全限定名;
a3)创建FactoryBean接口的实现类;在FactoryBean接口的实现类中,FactoryBean接口用于返回一个与一个被声明内部调用接口注解的接口相关的实例,该实例包括真实调用对象的类的全限定名和内部调用接口的默认实现类;
a4)创建InvocationHandler的实现类;
a5)创建内部调用注册器。
上述解除功能模块依赖的内部调用方法,使用时,通过@Autowired或@Resource的注解将接口的代理对象注入功能模块业务类中;当在功能模块业务类中执行代理对象的方法时,执行InvocationHandler的实现类的invoke方法,通过从Spring context中获取的实例或默认实现类创建的实例的对应方法,实现解除对功能模块的依赖。
上述解除功能模块依赖的内部调用方法,通过从Spring context中获取的实例或默认实现类创建的实例实现解除对功能模块的依赖具体操作为:通过方法名与参数查找真实对象中的方法,执行并返回结果。
上述解除功能模块依赖的内部调用方法,通过从Spring context中获取的实例或默认实现类创建的实例实现解除对功能模块的依赖的具体步骤如下:
S1)启动业务模块中的Spring程序并通过Spring程序扫描内部调用模块中被@InnerClient注释过的接口;
S2)当Spring程序扫描到一个被@InnerClient注释过的接口时,在内部调用注册器创建一个与该接口关联的BeanDefinition对象;
S3)将步骤S2)中创建的BeanDefinition对象的beanClass属性设置为FactoryBean类型的一个子类,并将该接口的类型添加到BeanDefinition对象的type属性中,同时将@innerClient属性添加到BeanDefinition对象中与@innerClient属性相对应的属性中,@innerClient属性包括className、qualifier和fallback;
S4)通过BeanDefinitionRegistry对象将经过步骤S3)处理后的BeanDefinition对象注册到Spring context中并由Spring对BeanDefinition对象进行维护,BeanDefinitionRegistry对象由Spring框架提供;
S5)在其他Bean中注入该接口时,通过调用FactoryBean的getBoject方法并根据BeanDefinition对象的type属性生成一个该接口的代理对象,然后返回;
S6)当Spring程序调用该接口的方法时,Spring程序调用的该接口的方法为该接口的代理对象的方法,Spring程序调用该接口的方法所使用的方法为invoke方法,在invoke方法中,通过className从Spring容器中获取对应的Bean,如果没有,则使用fallback属性创建一个与该接口关联的真实对象,通过方法名与参数查找真实对象中的方法,执行并返回结果。
上述解除功能模块依赖的内部调用方法,在步骤S2)中,声明内部调用接口注解还包括内部调用接口的别名和调用接口的默认实现类;当通过真实调用对象的类的全限定名找不到对应的实例时,则通过调用接口的默认实现类查找真实调用对象的类的对应的实例。
上述解除功能模块依赖的内部调用方法,在执行所述对应方法前,需进行一个查找过程,确保接口中声明的方法与形参和被调用实例中声明的方法的方法名和形参一致。
本发明的技术方案取得了如下有益的技术效果:
在使用java语言基于spring框架,以模块化程序设计来完成应用开发的情况下,开发中的功能模块无需等待依赖的功能模块完成后开发;功能模块无需依赖其它模块进行运行与测试;功能模块爆发式增长时,不会导致依赖混乱;功能模块完全独立使用,可以轻松复用;功能作为一个微服务运行。
附图说明
图1为解除功能模块依赖的内部调用方法原理图。
图2为解除功能模块依赖的内部调用方法流程图。
具体实施方式
程序模块化具有可以控制程序设计的复杂性、提高代码的重用性、易于维护和功能扩充、有利于团队开发的优点,但一个功能模块在功能设计上是独立的,但在开发和使用中会依赖很多其它功能模块,从而导致开发与测试困难。
为了不影响软件开发与测试或降低对软件开发与测试的影响,通常需要将一个功能模块与其他功能模块解除依赖。本发明解除功能模块依赖的内部调用方法,通过构建一个内部调用模块,并将功能模块与业务模块通过内部调用模块通信连接,如图1所示,通过对功能模块与业务模块之间依赖关系的降级处理来降低单个功能模块对整个软件的开发与测试的影响。
本实例中,构建一个启动模块,将所有功能模块或上述功能模块使用时所属依赖的方法引入启动模块内,将启动模块与内部调用模块通信连接。其中,启动模块的设置是基于下述原理进行的:
假设业务模块为A模块,功能模块为B模块。基于内部调用,A模块不依赖B模块的方式,A模块是可以单独运行的,因为A模块单独运行时需要依赖B模块的部分通过内部调用会进行降级处理(A模块会模拟B模块中依赖的功能,就是默认内部调用接口的默认实现);A模块依赖B模块的方式,即将A、B两个模块糅合到一起运行,此次A、B两个模块是一个整体,这个整体中的A模块的依赖B模块的功能也是有效的,依赖B模块的功能会通过内部调用,调到B模块的内容。基于上面两中方式,将第一种方式应用在开发场景中是比较合适的,开发与测试时不依赖其它模块,模块开发完成后,那每个模块的功能都是独立的,模块间也没有联系,依赖部分也都是降级处理,非正确的处理方式,一个系统是由多个功能模块构成的,此时就需要一个模块来专门处理将独立模块融合(启动模块依赖所有开发好的独立模块,形成一个整体)和启动(启动模块有一个方法,将这个整体运行起来)的职责,那这个模块就叫启动模块。
在内部调用模块内进行如下处理:
a1)创建在启动类上使用的开启内部调节用注解,所述开启内部调节用注解用于控制是否开启内部调用方法,在单体架构下使用内部调用,在微服务架构下使用微服务的调用方式;
a2) 创建作用在接口上的声明内部调用接口注解,声明内部调用接口注解包括真实调用对象的类全限定名、内部调用接口的别名和调用接口的默认实现类; 其中,调用接口的默认实现类是作为降级处理时,即通过真实调用对象的类的全限定名找不到对应的实例时才会使用;
a3)创建FactoryBean接口的实现类;在FactoryBean接口的实现类中,FactoryBean接口用于返回一个与一个被声明内部调用接口注解的接口相关的实例,该实例包括真实调用对象的类的全限定名和内部调用接口的默认实现类;
a4)创建InvocationHandler的实现类;调用代理对象的方法时,都会执行这个实现类中的invoke方法,方法中主要做的事情就是,通过真实调用对象的类全限定名,从Spring context中获取该类的实例,如果获取不到,则通过调用接口默认实现类创建一个实例,有实例之后,通过invoke方法中method、args参数从实例中查找对应的方法,存在对应的方法,则将method参数与查找到的方法进行映射,方便再次使用,如果不存在,则抛出未找到方法异常,有实例有方法后调用Method.invoke,将实例与参数传递,拿到返回值然后返回;
a5)创建内部调用注册器;在启动类上加有开启内部调用注解时,该内部调用注册器生效。
在使用时,通过@Autowired或@Resource的注解将接口的代理对象注入功能模块业务类中;当在功能模块业务类中执行代理对象的方法时,执行InvocationHandler的实现类的invoke方法,通过从Spring context中获取的实例或默认实现类创建的实例的对应方法,实现解除对功能模块的依赖。而在执行所述对应方法前,需进行一个查找过程,确保接口中声明的方法与形参和被调用实例中声明的方法的方法名和形参一致。
如图2所示,通过从Spring context中获取的实例或默认实现类创建的实例实现解除对功能模块的依赖具体操作为:通过方法名与参数查找真实对象中的方法,执行并返回结果,其具体步骤如下:
S1)启动业务模块中的Spring程序并通过Spring程序扫描内部调用模块中被@InnerClient注释过的接口;
S2)当Spring程序扫描到一个被@InnerClient注释过的接口时,在内部调用注册器创建一个与该接口关联的BeanDefinition对象;
S3)将步骤S2)中创建的BeanDefinition对象的beanClass属性设置为FactoryBean类型的一个子类,并将该接口的类型添加到BeanDefinition对象的type属性中,同时将@innerClient属性添加到BeanDefinition对象中与@innerClient属性相对应的属性中,@innerClient属性包括className、qualifier和fallback;
S4)通过BeanDefinitionRegistry对象将经过步骤S3)处理后的BeanDefinition对象注册到Spring context中并由Spring对BeanDefinition对象进行维护,BeanDefinitionRegistry对象由Spring框架提供;
S5)在其他Bean中注入该接口时,通过调用FactoryBean的getBoject方法并根据BeanDefinition对象的type属性生成一个该接口的代理对象,然后返回;
S6)当Spring程序调用该接口的方法时,Spring程序调用的该接口的方法为该接口的代理对象的方法,Spring程序调用该接口的方法所使用的方法为invoke方法,在invoke方法中,通过className从Spring容器中获取对应的Bean,如果没有,则使用fallback属性创建一个与该接口关联的真实对象,通过方法名与参数查找真实对象中的方法,执行并返回结果。
在步骤S2)中,声明内部调用接口注解还包括内部调用接口的别名和调用接口的默认实现类;当通过真实调用对象的类的全限定名找不到对应的实例时,则通过调用接口的默认实现类查找真实调用对象的类的对应的实例。
程序启动时,内部调用注册器对启动类所在包路径下的所有类进行扫描,获取到被声明内部调用接口注解所描述的所有接口,并为每个接口创建一个Bean描述对象,将FactoryBean实现类的类型设置为描述对象的beanClass属性,将真实调用对象的类全限定名、内部调用接口的别名、调用接口的默认实现属性添加进去,最后通过Bean描述对象注册器注册Bean描述对象。
然后,通过@Autowired或@Resource的注解将接口的代理对象注入功能模块业务类中;当在功能模块业务类中执行代理对象的方法时,执行InvocationHandler的实现类的invoke方法,通过从Spring context中获取的实例或默认实现类创建的实例的对应方法,实现解除对功能模块的依赖。
显然,上述实施例仅仅是为清楚地说明所作的举例,而并非对实施方式的限定。对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其它不同形式的变化或变动。这里无需也无法对所有的实施方式予以穷举。而由此所引伸出的显而易见的变化或变动仍处于本专利申请权利要求的保护范围之中。

Claims (8)

1.一种解除功能模块依赖的内部调用方法,其特征在于,构建一个内部调用模块,将功能模块与业务模块通过内部调用模块通信连接。
2.根据权利要求1所述的解除功能模块依赖的内部调用方法,其特征在于,构建一个启动模块,将所有功能模块或上述功能模块使用时所属依赖的方法引入启动模块内,将启动模块与内部调用模块通信连接。
3.根据权利要求2所述的解除功能模块依赖的内部调用方法,其特征在于,在内部调用模块内进行如下处理:
a1)创建在启动类上使用的开启内部调节用注解,所述开启内部调节用注解用于控制是否开启内部调用方法;
a2) 创建作用在接口上的声明内部调用接口注解,声明内部调用接口注解至少包括真实调用对象的类全限定名;
a3)创建FactoryBean接口的实现类;在FactoryBean接口的实现类中,FactoryBean接口用于返回一个与一个被声明内部调用接口注解的接口相关的实例,该实例包括真实调用对象的类的全限定名和内部调用接口的默认实现类;
a4)创建InvocationHandler的实现类;
a5)创建内部调用注册器。
4.根据权利要求3所述的解除功能模块依赖的内部调用方法,其特征在于,使用时,通过@Autowired或@Resource的注解将接口的代理对象注入功能模块业务类中;当在功能模块业务类中执行代理对象的方法时,执行InvocationHandler的实现类的invoke方法,通过从Spring context中获取的实例或默认实现类创建的实例的对应方法,实现解除对功能模块的依赖。
5.根据权利要求4所述的解除功能模块依赖的内部调用方法,其特征在于,通过从Spring context中获取的实例或默认实现类创建的实例实现解除对功能模块的依赖具体操作为:通过方法名与参数查找真实对象中的方法,执行并返回结果。
6.根据权利要求5所述的解除功能模块依赖的内部调用方法,其特征在于,通过从Spring context中获取的实例或默认实现类创建的实例实现解除对功能模块的依赖的具体步骤如下:
S1)启动业务模块中的Spring程序并通过Spring程序扫描内部调用模块中被@InnerClient注释过的接口;
S2)当Spring程序扫描到一个被@InnerClient注释过的接口时,在内部调用注册器创建一个与该接口关联的BeanDefinition对象;
S3)将步骤S2)中创建的BeanDefinition对象的beanClass属性设置为FactoryBean类型的一个子类,并将该接口的类型添加到BeanDefinition对象的type属性中,同时将@innerClient属性添加到BeanDefinition对象中与@innerClient属性相对应的属性中,@innerClient属性包括className、qualifier和fallback;
S4)通过BeanDefinitionRegistry对象将经过步骤S3)处理后的BeanDefinition对象注册到Spring context中并由Spring对BeanDefinition对象进行维护,BeanDefinitionRegistry对象由Spring框架提供;
S5)在其他Bean中注入该接口时,通过调用FactoryBean的getBoject方法并根据BeanDefinition对象的type属性生成一个该接口的代理对象,然后返回;
S6)当Spring程序调用该接口的方法时,Spring程序调用的该接口的方法为该接口的代理对象的方法,Spring程序调用该接口的方法所使用的方法为invoke方法,在invoke方法中,通过className从Spring容器中获取对应的Bean,如果没有,则使用fallback属性创建一个与该接口关联的真实对象,通过方法名与参数查找真实对象中的方法,执行并返回结果。
7.根据权利要求5或6所述的解除功能模块依赖的内部调用方法,其特征在于,在步骤S2)中,声明内部调用接口注解还包括内部调用接口的别名和调用接口的默认实现类;当通过真实调用对象的类的全限定名找不到对应的实例时,则通过调用接口的默认实现类查找真实调用对象的类的对应的实例。
8.根据权利要求5或6所述的解除功能模块依赖的内部调用方法,其特征在于,在执行所述对应方法前,需进行一个查找过程,确保接口中声明的方法与形参和被调用实例中声明的方法的方法名和形参一致。
CN202210133135.XA 2022-02-14 2022-02-14 一种解除功能模块依赖的内部调用方法 Active CN114237774B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210133135.XA CN114237774B (zh) 2022-02-14 2022-02-14 一种解除功能模块依赖的内部调用方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210133135.XA CN114237774B (zh) 2022-02-14 2022-02-14 一种解除功能模块依赖的内部调用方法

Publications (2)

Publication Number Publication Date
CN114237774A true CN114237774A (zh) 2022-03-25
CN114237774B CN114237774B (zh) 2022-05-31

Family

ID=80747658

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210133135.XA Active CN114237774B (zh) 2022-02-14 2022-02-14 一种解除功能模块依赖的内部调用方法

Country Status (1)

Country Link
CN (1) CN114237774B (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2023197128A1 (zh) * 2022-04-12 2023-10-19 华为技术有限公司 一种测试方法和控制装置

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103559025A (zh) * 2013-10-21 2014-02-05 沈阳建筑大学 一种采用聚类方式进行软件重构的方法
CN111143451A (zh) * 2019-12-16 2020-05-12 中国航空综合技术研究所 用于分层架构设计的ssm框架设计方法
CN111190577A (zh) * 2019-12-19 2020-05-22 贠学文 一种提供对工具包统一管理并实现轻量级mvc的框架
CN113626225A (zh) * 2021-10-11 2021-11-09 中航金网(北京)电子商务有限公司 程序调用方法、终端设备及介质
US20210382731A1 (en) * 2020-06-07 2021-12-09 Asaf Ben Natan Method for componentization of enterprise applications using plugins

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103559025A (zh) * 2013-10-21 2014-02-05 沈阳建筑大学 一种采用聚类方式进行软件重构的方法
CN111143451A (zh) * 2019-12-16 2020-05-12 中国航空综合技术研究所 用于分层架构设计的ssm框架设计方法
CN111190577A (zh) * 2019-12-19 2020-05-22 贠学文 一种提供对工具包统一管理并实现轻量级mvc的框架
US20210382731A1 (en) * 2020-06-07 2021-12-09 Asaf Ben Natan Method for componentization of enterprise applications using plugins
CN113626225A (zh) * 2021-10-11 2021-11-09 中航金网(北京)电子商务有限公司 程序调用方法、终端设备及介质

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2023197128A1 (zh) * 2022-04-12 2023-10-19 华为技术有限公司 一种测试方法和控制装置

Also Published As

Publication number Publication date
CN114237774B (zh) 2022-05-31

Similar Documents

Publication Publication Date Title
US7882492B2 (en) Intelligent computer program debugger, and system and method for implementing the same
Canal et al. Model-based adaptation of behavioral mismatching components
EP1582985B1 (en) Test case inheritance controlled via attributes
US10466998B2 (en) Model based upgrade campaign generation
CN107203419A (zh) 应用程序中的模块间调用方法、装置及系统
CN114237774B (zh) 一种解除功能模块依赖的内部调用方法
US7395526B2 (en) Method and system for managing application server lifecycle
CN110532182B (zh) 一种虚拟化平台的自动化测试方法及装置
CN112953983A (zh) Sftp传输方法及装置
US20090037878A1 (en) Web Application Development Tool
CN109656528A (zh) 基于标准的组件化软件开发方法
CN112783568A (zh) 应用程序的初始化方法、装置、设备和存储介质
US20110047526A1 (en) Method and a system for transforming an object model
US8539468B2 (en) System and methods for replacing software application classes using transparent object adapters
CN112527468A (zh) 一种联盟链一站式自动部署与测试方法及系统
CN109901999B (zh) 基于uvm的可编程逻辑的仿真方法和系统
CN115129740B (zh) 一种云原生环境下的分布式微服务数据库更新方法及系统
CN114385504A (zh) 微服务应用的开发调试方法及装置
Farahani et al. Configuration management model in evolutionary software product line
CN115344268A (zh) 一种多平台嵌入式开发环境编译方法及装置
Flores et al. Testing-based selection method for integrability on service-oriented applications
CN115237386B (zh) 用于大型复杂Windows原生桌面开发的方法及系统
CN114579460A (zh) 用户界面测试方法和装置
CN113050972A (zh) 一种系统升级方法、装置、设备及存储介质
US20060059471A1 (en) Calling non-public types

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
TA01 Transfer of patent application right
TA01 Transfer of patent application right

Effective date of registration: 20220424

Address after: 100094 3a26, floor 3a, building 1, Shengjing entrepreneurship Park, tujing village, south side of Dengzhuang South Road and west side of Youyi Road, Xibeiwang Town, Haidian District, Beijing

Applicant after: Beijing Huayu Shuguan Technology Co.,Ltd.

Address before: 100085 room 2110, building 1, Pioneer Building, No.7 Kaifa Road, Shangdi Information Industry base, Haidian District, Beijing

Applicant before: Beijing UNITA Information Technology Co.,Ltd.

GR01 Patent grant
GR01 Patent grant