CN114327385B - 一种基于Java反射和Spring容器实现业务数据搜索的方法及装置 - Google Patents
一种基于Java反射和Spring容器实现业务数据搜索的方法及装置 Download PDFInfo
- Publication number
- CN114327385B CN114327385B CN202111465992.1A CN202111465992A CN114327385B CN 114327385 B CN114327385 B CN 114327385B CN 202111465992 A CN202111465992 A CN 202111465992A CN 114327385 B CN114327385 B CN 114327385B
- Authority
- CN
- China
- Prior art keywords
- search
- class
- global
- service data
- spring container
- 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.)
- Active
Links
Classifications
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Stored Programmes (AREA)
Abstract
本发明公开了一种基于Java反射和Spring容器实现业务数据搜索的方法及装置,该方法通过搜索项配置化,灵活控制需要参与全局搜索的业务数据项,省掉了变更代码、测试、重新发布应用等环节;通过Spring容器工具类和配置信息,减少了大量的依赖注入代码,使全局搜索的Service类更简洁、耦合度更低;通过Java反射技术让业务层Service的调用代码模板化,将搜索任务分解多个搜索子任务,配合线程池并发甚至并行的执行子任务,从而提升全局搜索的速度。
Description
技术领域
本发明涉及参数配置和数据搜索研究领域,具体涉及一种基于Java反射和Spring容器实现业务数据搜索的方法及装置。
背景技术
随着互联网的普及和发展,Java语言因其简单、面向对象编程思想、平台无关系等特点,成为了最流行的编程语言之一。Spring框架由于其IoC(依赖注入)和AOP(面向切面)的特点,极大的简化了企业级应用的开发,成为了最热门的Java开发框架,大量的应用基于Spring框架完成开发。最开始系统大多数都是围绕着业务相关的流程进行开发的,通常业务数据的搜索方法都会有一个关键字模糊搜索字段,后期才会考虑将这些业务数据的模糊搜索做成全局搜索功能。
在实现本发明过程中,发明人发现现有技术中至少存在如下问题:现有的业务数据搜索方案,通常为了复用现有的业务查询方法、开发的简单性,会在全局搜索的Service对象中注入相关业务的Service对象并依次调用业务查询方法。但这种方案存在以下几个问题:一、需要把要进行搜索的业务Service对象全部声明依赖注入,代码显得非常的臃肿;二、代码的耦合性很高,需要增加或减少相关业务数据的搜索,都需要修改全局搜索的方法,对于生产环境还需要重新部署系统、流程相对较长;三、无法使用多线程技术提升搜索的速度。
发明内容
为了克服现有技术的不足,本发明提供了一种基于Java反射和Spring容器实现业务数据搜索的方法及装置,通过搜索项配置化、结合Java反射和Spring容器以及多线程技术,极大降低了代码的耦合度,提高了全局搜索的速度。技术方案如下:
本发明提供了一种基于Java反射和Spring容器实现业务数据搜索的方法,所述方法包括以下步骤:
步骤1,梳理现有代码,将需要参与全局搜索的业务层Service类的全路径名ServiceClass、方法名称MethodName、参数类搜索关键字的字段SearchWord、是否启用Enable这四个信息作为数据库配置表的四列,存入数据库中,作为配置信息C。
步骤2,新增Spring容器工具类ContextUtil,继承Spring容器初始化完成通知接口ApplicationContextAware,并将工具类ContextUtil注册为Spring组件,在Spring容器启动完成后获取Spring容器Context对象的引用,工具类ContextUtil包含一个通过全路径名ServiceClass获取Bean对象的方法CM;创建线程池任务执行器ThreadPoolTaskExecutor类的线程池任务执行器对象Pool;在全局搜索的Service类GlobalSearchService中注入Spring容器工具组件类ContextUtil对象T、线程池任务执行器对象Pool。
步骤3,执行全局搜索方法时,先从配置信息C中获取启用的搜索项配置信息列表L;根据搜索项配置信息列表L的数量N,创建多线程执行同步器CountDownLatch对象CDL,创建存储全局搜索结果的List对象ResultList。
步骤4,遍历搜索项配置信息列表L,对于其中的每个搜索项S,创建一个搜索任务Runnalbe对象R;对象R具体的执行动作如下:
根据搜索项S的全路径名ServiceClass信息,调用工具类ContextUtil对象T的CM方法,从Spring容器中获取对应的Bean代理对象B;
调用代理对象B对应Class对象的getMethods方法获取全部方法的数组,遍历数组获取与搜索项S的方法名称MethodName匹配的Method对象M。
通过Method对象M获取入参Class对象PC,调用PC的getFields方法获取全部属性的数组,遍历数组获取与搜索项S的SearchWord字段对应的Field对象F。
通过Method对象M入参Class对象PC的newInstance方法实例化请求参数对象P,先调用Field对象F的setAccessible(true)的方法修改属性的写权限,再调用Field对象F的set方法,设置Field对象F的属性值为搜索词W。
Method对象M执行invoke方法,执行业务数据对应的搜索方法。
涉及到并发操作全局搜索结果的List对象ResultList对象,加锁将搜索方法执行结果存入全局搜索结果的List对象ResultList对象中。
调用多线程执行同步器CDL的countDown方法,表示当前搜索任务已完成。
步骤5,将搜索任务Runnalbe对象R提交到线程池任务执行器Pool对象中;
将全局任务分解为多个子任务,并分别交给不同的线程去执行。
步骤6,主线程调用多线程执行同步器CDL的await方法,等待所有搜索子任务全部完成。
步骤7,整理合并搜索结果并返回。
优选的,步骤1中所述配置信息C为控制参与全局搜索的业务数据项的入口,通过在数据库配置表中新增一行配置数据即可将业务数据项纳入全局搜索,通过修改数据库配置表行记录是否启用Enable列的值即可控制对应业务数据项是否参与全局搜索。
优选的,步骤2中工具类ContextUtil通过全路径名ServiceClass可以获取业务层Service 对象的引用。
与现有技术相比,上述技术方案中的一个技术方案具有如下有益效果:通过搜索项配置化,可以灵活控制需要参与全局搜索的业务数据项,省掉了变更代码、测试、重新发布应用等环节;通过Spring容器工具类和配置信息,减少了大量的依赖注入代码,使全局搜索的Service类更简洁、耦合度更低;通过Java反射技术让业务层Service的调用代码模板化,将搜索任务分解多个搜索子任务,配合线程池并发甚至并行的执行子任务,从而提升全局搜索的速度。
具体实施方式
为了阐明本发明的技术方案和工作原理,下面将对本公开实施方式做进一步的详细描述。上述所有可选技术方案,可以采用任意结合形成本公开的可选实施例,在此不再一一赘述。
本申请的说明书和权利要求书中的术语“步骤1”、“步骤2”、“步骤3”等类似描述是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除了在这里描述的那些以外的顺序实施。
第一方面:本公开实施例提供了一种基于Java反射和Spring容器实现业务数据搜索的方法,该方法包括以下步骤:
步骤1,梳理现有代码,将需要参与全局搜索的业务层Service类的全路径名ServiceClass、方法名称MethodName、参数类搜索关键字的字段SearchWord、是否启用Enable这四个信息作为数据库配置表的四列,存入数据库中,作为配置信息C。
优选的,所述配置信息C为控制参与全局搜索的业务数据项的入口,通过在数据库配置表中新增一行配置数据即可将业务数据项纳入全局搜索,通过修改数据库配置表行记录是否启用Enable列的值即可控制对应业务数据项是否参与全局搜索;相较于传统硬编码的方案,此方法更加灵活、代码之间耦合度更低。
步骤2,新增Spring容器工具类ContextUtil,继承Spring容器初始化完成通知接口ApplicationContextAware,并将工具类ContextUtil注册为Spring组件,在Spring容器启动完成后获取Spring容器Context对象的引用,工具类ContextUtil包含一个通过全路径名ServiceClass获取Bean对象的方法CM;创建线程池任务执行器ThreadPoolTaskExecutor类的线程池任务执行器对象Pool;在全局搜索的Service类GlobalSearchService中注入Spring容器工具组件类ContextUtil对象T、线程池任务执行器对象Pool。
优选的,工具类ContextUtil通过全路径名ServiceClass可以获取业务层Service对象的引用,避免硬编码的方式注入业务层Service对象,代码更加简洁、耦合度更低。
步骤3,执行全局搜索方法时,先从配置信息C中获取启用的搜索项配置信息列表L;根据搜索项配置信息列表L的数量N,创建多线程执行同步器CountDownLatch对象CDL,创建存储全局搜索结果的List对象ResultList。
步骤4,遍历搜索项配置信息列表L,对于其中的每个搜索项S,创建一个搜索任务Runnalbe对象R;对象R具体的执行动作如下:
根据搜索项S的全路径名ServiceClass信息,调用工具类ContextUtil对象T的CM方法,从Spring容器中获取对应的Bean代理对象B。
调用代理对象B对应Class对象的getMethods方法获取全部方法的数组,遍历数组获取与搜索项S的方法名称MethodName匹配的Method对象M。
通过Method对象M获取入参Class对象PC,调用PC的getFields方法获取全部属性的数组,遍历数组获取与搜索项S的SearchWord字段对应的Field对象F。
通过Method对象M入参Class对象PC的newInstance方法实例化请求参数对象P,先调用Field对象F的setAccessible(true)的方法修改属性的写权限,再调用Field对象F的set方法(传入请求参数对象P和搜索词W),设置Field对象F的属性值为搜索词W。
Method对象M执行invoke方法(带入代理对象B、请求参数对象P两个参数),执行业务数据对应的搜索方法。
涉及到并发操作全局搜索结果的List对象ResultList对象,加锁将搜索方法执行结果存入全局搜索结果的List对象ResultList对象中。
调用多线程执行同步器CDL的countDown方法,表示当前搜索任务已完成。
步骤5,将搜索任务Runnalbe对象R提交到线程池任务执行器Pool对象中。
通过将全局任务分解为多个子任务,并分别交给不同的线程去执行,能够充分利用计算机多核的CPU资源,减少搜索的执行时间。
步骤6,主线程调用多线程执行同步器CDL的await方法,等待所有搜索子任务全部完成。
步骤7,整理合并搜索结果并返回。
第二方面,本公开实施例提供了一种基于Java反射和Spring容器实现业务数据搜索的装置。
基于相同的技术构思,该装置可以实现或执行所有可能的实现方式中任一项所述的一种基于Java反射和Spring容器实现业务数据搜索的方法。
上述实施例提供的一种基于Java反射和Spring容器实现业务数据搜索的装置与一种基于Java反射和Spring容器实现业务数据搜索的方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
以上对本发明进行了示例性描述,显然,本发明具体实现并不受上述方式的限制,凡是采用了本发明的方法构思和技术方案进行的各种非实质性的改进;或者未经改进、等同替换,将本发明的上述构思和技术方案直接应用于其他场合的,均在本发明的保护范围之内。
Claims (4)
1.一种基于Java反射和Spring容器实现业务数据搜索的方法,其特征在于,该方法包括如下步骤:
步骤1,梳理现有代码,将需要参与全局搜索的业务层Service类的全路径名ServiceClass、方法名称MethodName、参数类搜索关键字的字段SearchWord、是否启用Enable这四个信息作为数据库配置表的四列,存入数据库中,作为配置信息C;
步骤2,新增Spring容器的工具类ContextUtil,实现Spring容器初始化完成后的通知接口ApplicationContextAware,并将工具类ContextUtil注册为Spring组件,在Spring容器启动完成后获取Spring容器Context对象的引用,工具类ContextUtil包含一个通过全路径名ServiceClass获取Bean对象的方法CM;创建线程池任务执行器ThreadPoolTaskExecutor类的线程池任务执行器对象Pool;在全局搜索的Service类GlobalSearchService中注入Spring容器工具组件类ContextUtil对象T、线程池任务执行器对象Pool;
步骤3,执行全局搜索方法时,先从配置信息C中获取启用的搜索项配置信息列表L;根据搜索项配置信息列表L的数量N,创建多线程执行同步器CountDownLatch对象CDL,创建存储全局搜索结果的List对象ResultList;
步骤4,遍历搜索项配置信息列表L,对于其中的每个搜索项S,创建一个搜索任务Runnalbe对象R;对象R具体的执行动作如下:
根据搜索项S的全路径名ServiceClass信息,调用工具类ContextUtil对象T的CM方法,从Spring容器中获取对应的Bean代理对象B;
调用代理对象B对应Class对象的getMethods方法获取全部方法的数组,遍历数组获取与搜索项S的方法名称MethodName匹配的Method对象M;
通过Method对象M获取入参Class对象PC,调用PC的getFields方法获取全部属性的数组,遍历数组获取与搜索项S的SearchWord字段对应的Field对象F;
通过Method对象M入参Class对象PC的newInstance方法实例化请求参数对象P,先调用Field对象F的setAccessible(true)的方法修改属性的写权限,再调用Field对象F的set方法,设置Field对象F的属性值为搜索词W;
Method对象M执行invoke方法,执行业务数据对应的搜索方法;
涉及到并发操作全局搜索结果的List对象ResultList对象,加锁将搜索方法执行结果存入全局搜索结果的List对象ResultList对象中;
调用多线程执行同步器CDL的countDown方法,表示当前搜索任务已完成;
步骤5,将搜索任务Runnalbe对象R提交到线程池任务执行器Pool对象中;
将全局任务分解为多个子任务,并分别交给不同的线程去执行;
步骤6,主线程调用多线程执行同步器CDL的await方法,等待所有搜索子任务全部完成;
步骤7,整理合并搜索结果并返回。
2.根据权利要求1所述的一种基于Java反射和Spring容器实现业务数据搜索的方法,其特征在于,步骤1中所述配置信息C为控制参与全局搜索的业务数据项的入口,通过在数据库配置表中新增一行配置数据即可将业务数据项纳入全局搜索,通过修改数据库配置表行记录是否启用Enable列的值即可控制对应业务数据项是否参与全局搜索。
3.根据权利要求1或2任一项所述的一种基于Java反射和Spring容器实现业务数据搜索的方法,其特征在于,步骤2中工具类ContextUtil通过全路径名ServiceClass可以获取业务层Service 对象的引用。
4.一种基于Java反射和Spring容器实现业务数据搜索的装置,其特征在于,该装置可以实现权利要求1-3任一项所述的一种基于Java反射和Spring容器实现业务数据搜索的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111465992.1A CN114327385B (zh) | 2021-12-03 | 2021-12-03 | 一种基于Java反射和Spring容器实现业务数据搜索的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111465992.1A CN114327385B (zh) | 2021-12-03 | 2021-12-03 | 一种基于Java反射和Spring容器实现业务数据搜索的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN114327385A CN114327385A (zh) | 2022-04-12 |
CN114327385B true CN114327385B (zh) | 2023-05-02 |
Family
ID=81048090
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111465992.1A Active CN114327385B (zh) | 2021-12-03 | 2021-12-03 | 一种基于Java反射和Spring容器实现业务数据搜索的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114327385B (zh) |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105230050A (zh) * | 2013-05-31 | 2016-01-06 | 思科技术公司 | 基于全局搜索键的本地搜索内容的实时返回 |
CN112860978A (zh) * | 2021-03-31 | 2021-05-28 | 中国工商银行股份有限公司 | 全局搜索方法和装置 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10417649B2 (en) * | 2012-09-28 | 2019-09-17 | Oracle International Corporation | Business process global searching |
CN109815261B (zh) * | 2018-12-11 | 2021-11-02 | 荣联科技集团股份有限公司 | 全局搜索功能实现及数据实时同步方法、装置及电子设备 |
CN111914066B (zh) * | 2020-08-17 | 2024-02-02 | 山东合天智汇信息技术有限公司 | 多源数据库全局搜索方法及系统 |
-
2021
- 2021-12-03 CN CN202111465992.1A patent/CN114327385B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105230050A (zh) * | 2013-05-31 | 2016-01-06 | 思科技术公司 | 基于全局搜索键的本地搜索内容的实时返回 |
CN112860978A (zh) * | 2021-03-31 | 2021-05-28 | 中国工商银行股份有限公司 | 全局搜索方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN114327385A (zh) | 2022-04-12 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8122292B2 (en) | Debugging of business flows deployed in production servers | |
CN101446918B (zh) | 一种实现用户态调试器调试单个函数的方法及系统 | |
JPH047640A (ja) | クラス継承解決処理方法 | |
CN106681820A (zh) | 基于消息组合的可扩展大数据计算方法 | |
US10671361B2 (en) | Automatically determining data dependencies to facilitate code execution | |
US10310915B2 (en) | Efficient sequencer for multiple concurrently-executing threads of execution | |
CN111857984A (zh) | 银行系统中的作业调用处理方法、装置和计算机设备 | |
Qu et al. | Design and implementation of system generator based on rule engine | |
CN114327385B (zh) | 一种基于Java反射和Spring容器实现业务数据搜索的方法及装置 | |
WO2020229900A1 (en) | Service management in a dbms | |
US9164813B2 (en) | Using a debug engine to identify threads that wait for a mutex | |
Moschoyiannis et al. | True concurrency in long-running transactions for digital ecosystems | |
Nykiel et al. | Sharing across multiple MapReduce jobs | |
US7028055B2 (en) | Method and apparatus for improving transaction specification by marking application states | |
Chen et al. | Algorithms for HLA-based distributed simulation cloning | |
US20020178303A1 (en) | System, method and computer program for application support in a data processing system | |
Jia et al. | VeriLin: A Linearizability Checker for Large-Scale Concurrent Objects | |
Tang et al. | Handling uncertainties in workflow applications | |
Chen | On using static analysis in distributed system testing | |
CN117591438B (zh) | 一种ui组件原子化的自动化测试方法及相关装置 | |
De Porre et al. | Squirrel: an extensible distributed key-value store | |
Ribeiro et al. | Verifying Liveness and Real-Time of OS-Based Embedded Software | |
Jia¹ et al. | Check for updates | |
CN117873434A (zh) | 一种基于构件技术的海上任务筹划方法 | |
Fernandez | BPEL with Explicit Data Flow: Model, Editor, and Partitioning Tool |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |