一种解除功能模块依赖的内部调用方法与流程

文档序号:29424848发布日期:2022-03-26 14:55阅读:102来源:国知局
一种解除功能模块依赖的内部调用方法与流程

1.本发明涉及软件架构、功能实现、代码复用技术领域。具体地说是一种解除功能模块依赖的内部调用方法。


背景技术:

2.使用java语言基于spring框架开发应用时,通常使用模块化程序设计来完成应用开发。功能模块简单来书是指数据说明、可执行语句等程序元素的集合,它是指单独命名的可通过名字来访问的过程、函数、子程序或宏调用。功能模块化是将程序划分成若干个功能模块,每个功能模块完成了一个子功能,并在这些模块之间建立必要的联系,通过模块的互相协作完成整个功能的程序设计方法,以满足所要求的整个应用的功能。
3.模块化程序设计有很多优点,但相对的,对模块的独立、规模、层次等分解也会有很大难度。普遍的是,一个功能模块在功能设计上是独立的,但在开发和使用中会依赖很多其它功能模块,从而导致开发与测试困难。单体应用随着体量原来越大,功能模块越来越多,功能模块的耦合严重、可靠性差等问题也开始显现出来。
4.应用设计时,在应用场景固定的情况下,结合用户量、数据量等因素,从而选择使用单体或者分布式的架构,但以产品的形式是无法满足的。因为产品开发完成后,功能是固定的,但是客户的情况是不固定的,从而导致用户量、数据量等因素也不固定。此时我们无法选择将应用以单体或微服务的方式开发与部署。


技术实现要素:

5.为此,本发明所要解决的技术问题在于提供一种解除功能模块依赖的内部调用方法,通过在功能模块与业务模块之间增设内部调用模块,实现功能模块与业务模块之间的依赖关系解除,同时还可以保证业务模块可以对功能模块的调用。
6.为解决上述技术问题,本发明提供如下技术方案:一种解除功能模块依赖的内部调用方法,构建一个内部调用模块,将功能模块与业务模块通过内部调用模块通信连接。
7.上述解除功能模块依赖的内部调用方法,构建一个启动模块,将所有功能模块或上述功能模块使用时所属依赖的方法引入启动模块内,将启动模块与内部调用模块通信连接。
8.上述解除功能模块依赖的内部调用方法,在内部调用模块内进行如下处理:a1)创建在启动类上使用的开启内部调节用注解,所述开启内部调节用注解用于控制是否开启内部调用方法;a2) 创建作用在接口上的声明内部调用接口注解,声明内部调用接口注解至少包括真实调用对象的类全限定名;a3)创建factorybean接口的实现类;在factorybean接口的实现类中,factorybean接口用于返回一个与一个被声明内部调用接口注解的接口相关的实例,该实
例包括真实调用对象的类的全限定名和内部调用接口的默认实现类;a4)创建invocationhandler的实现类;a5)创建内部调用注册器。
9.上述解除功能模块依赖的内部调用方法,使用时,通过@autowired或@resource的注解将接口的代理对象注入功能模块业务类中;当在功能模块业务类中执行代理对象的方法时,执行invocationhandler的实现类的invoke方法,通过从spring context中获取的实例或默认实现类创建的实例的对应方法,实现解除对功能模块的依赖。
10.上述解除功能模块依赖的内部调用方法,通过从spring context中获取的实例或默认实现类创建的实例实现解除对功能模块的依赖具体操作为:通过方法名与参数查找真实对象中的方法,执行并返回结果。
11.上述解除功能模块依赖的内部调用方法,通过从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属性创建一个与该接口关联的真实对象,通过方法名与参数查找真实对象中的方法,执行并返回结果。
12.上述解除功能模块依赖的内部调用方法,在步骤s2)中,声明内部调用接口注解还包括内部调用接口的别名和调用接口的默认实现类;当通过真实调用对象的类的全限定名找不到对应的实例时,则通过调用接口的默认实现类查找真实调用对象的类的对应的实例。
13.上述解除功能模块依赖的内部调用方法,在执行所述对应方法前,需进行一个查找过程,确保接口中声明的方法与形参和被调用实例中声明的方法的方法名和形参一致。
14.本发明的技术方案取得了如下有益的技术效果:在使用java语言基于spring框架,以模块化程序设计来完成应用开发的情况下,开发中的功能模块无需等待依赖的功能模块完成后开发;功能模块无需依赖其它模块进行
运行与测试;功能模块爆发式增长时,不会导致依赖混乱;功能模块完全独立使用,可以轻松复用;功能作为一个微服务运行。
附图说明
15.图1为解除功能模块依赖的内部调用方法原理图。
16.图2为解除功能模块依赖的内部调用方法流程图。
具体实施方式
17.程序模块化具有可以控制程序设计的复杂性、提高代码的重用性、易于维护和功能扩充、有利于团队开发的优点,但一个功能模块在功能设计上是独立的,但在开发和使用中会依赖很多其它功能模块,从而导致开发与测试困难。
18.为了不影响软件开发与测试或降低对软件开发与测试的影响,通常需要将一个功能模块与其他功能模块解除依赖。本发明解除功能模块依赖的内部调用方法,通过构建一个内部调用模块,并将功能模块与业务模块通过内部调用模块通信连接,如图1所示,通过对功能模块与业务模块之间依赖关系的降级处理来降低单个功能模块对整个软件的开发与测试的影响。
19.本实例中,构建一个启动模块,将所有功能模块或上述功能模块使用时所属依赖的方法引入启动模块内,将启动模块与内部调用模块通信连接。其中,启动模块的设置是基于下述原理进行的:假设业务模块为a模块,功能模块为b模块。基于内部调用,a模块不依赖b模块的方式,a模块是可以单独运行的,因为a模块单独运行时需要依赖b模块的部分通过内部调用会进行降级处理(a模块会模拟b模块中依赖的功能,就是默认内部调用接口的默认实现);a模块依赖b模块的方式,即将a、b两个模块糅合到一起运行,此次a、b两个模块是一个整体,这个整体中的a模块的依赖b模块的功能也是有效的,依赖b模块的功能会通过内部调用,调到b模块的内容。基于上面两中方式,将第一种方式应用在开发场景中是比较合适的,开发与测试时不依赖其它模块,模块开发完成后,那每个模块的功能都是独立的,模块间也没有联系,依赖部分也都是降级处理,非正确的处理方式,一个系统是由多个功能模块构成的,此时就需要一个模块来专门处理将独立模块融合(启动模块依赖所有开发好的独立模块,形成一个整体)和启动(启动模块有一个方法,将这个整体运行起来)的职责,那这个模块就叫启动模块。
20.在内部调用模块内进行如下处理:a1)创建在启动类上使用的开启内部调节用注解,所述开启内部调节用注解用于控制是否开启内部调用方法,在单体架构下使用内部调用,在微服务架构下使用微服务的调用方式;a2) 创建作用在接口上的声明内部调用接口注解,声明内部调用接口注解包括真实调用对象的类全限定名、内部调用接口的别名和调用接口的默认实现类; 其中,调用接口的默认实现类是作为降级处理时,即通过真实调用对象的类的全限定名找不到对应的实例时才会使用;a3)创建factorybean接口的实现类;在factorybean接口的实现类中,
factorybean接口用于返回一个与一个被声明内部调用接口注解的接口相关的实例,该实例包括真实调用对象的类的全限定名和内部调用接口的默认实现类;a4)创建invocationhandler的实现类;调用代理对象的方法时,都会执行这个实现类中的invoke方法,方法中主要做的事情就是,通过真实调用对象的类全限定名,从spring context中获取该类的实例,如果获取不到,则通过调用接口默认实现类创建一个实例,有实例之后,通过invoke方法中method、args参数从实例中查找对应的方法,存在对应的方法,则将method参数与查找到的方法进行映射,方便再次使用,如果不存在,则抛出未找到方法异常,有实例有方法后调用method.invoke,将实例与参数传递,拿到返回值然后返回;a5)创建内部调用注册器;在启动类上加有开启内部调用注解时,该内部调用注册器生效。
21.在使用时,通过@autowired或@resource的注解将接口的代理对象注入功能模块业务类中;当在功能模块业务类中执行代理对象的方法时,执行invocationhandler的实现类的invoke方法,通过从spring context中获取的实例或默认实现类创建的实例的对应方法,实现解除对功能模块的依赖。而在执行所述对应方法前,需进行一个查找过程,确保接口中声明的方法与形参和被调用实例中声明的方法的方法名和形参一致。
22.如图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属性创建一个与该接口关联的真实对象,通过方法名与参数查找真实对象中的方法,执行并返回结果。
23.在步骤s2)中,声明内部调用接口注解还包括内部调用接口的别名和调用接口的默认实现类;当通过真实调用对象的类的全限定名找不到对应的实例时,则通过调用接口
的默认实现类查找真实调用对象的类的对应的实例。
24.程序启动时,内部调用注册器对启动类所在包路径下的所有类进行扫描,获取到被声明内部调用接口注解所描述的所有接口,并为每个接口创建一个bean描述对象,将factorybean实现类的类型设置为描述对象的beanclass属性,将真实调用对象的类全限定名、内部调用接口的别名、调用接口的默认实现属性添加进去,最后通过bean描述对象注册器注册bean描述对象。
25.然后,通过@autowired或@resource的注解将接口的代理对象注入功能模块业务类中;当在功能模块业务类中执行代理对象的方法时,执行invocationhandler的实现类的invoke方法,通过从spring context中获取的实例或默认实现类创建的实例的对应方法,实现解除对功能模块的依赖。
26.显然,上述实施例仅仅是为清楚地说明所作的举例,而并非对实施方式的限定。对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其它不同形式的变化或变动。这里无需也无法对所有的实施方式予以穷举。而由此所引伸出的显而易见的变化或变动仍处于本专利申请权利要求的保护范围之中。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1