CN109388403A - 依赖注入方法、装置、设备和存储介质 - Google Patents
依赖注入方法、装置、设备和存储介质 Download PDFInfo
- Publication number
- CN109388403A CN109388403A CN201811122064.3A CN201811122064A CN109388403A CN 109388403 A CN109388403 A CN 109388403A CN 201811122064 A CN201811122064 A CN 201811122064A CN 109388403 A CN109388403 A CN 109388403A
- Authority
- CN
- China
- Prior art keywords
- dependence
- code
- feature
- file
- source code
- 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
Links
- 238000002347 injection Methods 0.000 title claims abstract description 84
- 239000007924 injection Substances 0.000 title claims abstract description 84
- 238000000034 method Methods 0.000 title claims abstract description 55
- 230000015654 memory Effects 0.000 claims description 31
- 238000004458 analytical method Methods 0.000 claims description 28
- 238000012545 processing Methods 0.000 abstract description 22
- 230000008569 process Effects 0.000 description 15
- 238000010586 diagram Methods 0.000 description 14
- 230000003068 static effect Effects 0.000 description 12
- 230000006870 function Effects 0.000 description 9
- 230000000875 corresponding effect Effects 0.000 description 7
- 238000004891 communication Methods 0.000 description 4
- 238000004590 computer program Methods 0.000 description 4
- 239000000243 solution Substances 0.000 description 4
- 230000032258 transport Effects 0.000 description 3
- 230000006399 behavior Effects 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 2
- 238000011161 development Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000002159 abnormal effect Effects 0.000 description 1
- 230000008901 benefit Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 238000012512 characterization method Methods 0.000 description 1
- 230000002596 correlated effect Effects 0.000 description 1
- 230000002708 enhancing effect Effects 0.000 description 1
- 238000000605 extraction Methods 0.000 description 1
- 230000008676 import Effects 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
- 230000002452 interceptive effect Effects 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 239000000203 mixture Substances 0.000 description 1
- 239000007787 solid Substances 0.000 description 1
- 230000001360 synchronised effect Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/427—Parsing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
- G06F8/433—Dependency analysis; Data or control flow analysis
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本申请涉及一种依赖注入方法、装置、设备和存储介质。所述方法包括:在进行程序编译时,收集源代码文件;解析所述源代码文件,得到依赖关系特征;生成所述依赖关系特征的依赖关系代码;根据所述源代码文件和所述依赖关系代码,生成应用程序,供用户端运行所述应用程序时,执行所述依赖关系代码得到所述应用程序的依赖关系。根据本申请实施例,避免了用户端在运行应用程序时进行反射处理所导致的用户端顿卡、响应迟钝的问题。
Description
技术领域
本申请涉及程序开发领域,特别是涉及一种依赖注入方法、装置、设备和存储介质。
背景技术
在应用程序开发中,主要是通过依赖注入的方式,来解决不同模块之间依赖问题。目前的依赖注入是通过反射处理来实现。在应用程序运行时,通过反射处理可以收集应用程序的元数据信息,并根据这些元数据信息,确定应用程序中各个模块之间的依赖关系。
然而,大量的反射处理会非常耗时和占用资源,用户启动应用程序之后,应用程序在进行大量的反射处理时,会引起用户端顿卡、响应迟钝等的异常情况。
因此,目前的依赖注入方式存在着程序运行导致用户端异常的问题。
发明内容
基于此,有必要针对上述技术问题,提供一种依赖注入方法、装置、计算机设备和存储介质。
第一方面,提供了一种依赖注入方法,包括:
在进行程序编译时,收集源代码文件;
解析所述源代码文件,得到依赖关系特征;
生成所述依赖关系特征的依赖关系代码;
根据所述源代码文件和所述依赖关系代码,生成应用程序,供用户端运行所述应用程序时,执行所述依赖关系代码得到所述应用程序的依赖关系。
在其中一个实施例中,所述依赖关系代码包括依赖注入代码和依赖导出代码,所述生成所述依赖关系特征的依赖关系代码,包括:
当所述依赖关系特征为依赖注入特征,生成所述依赖注入代码;
当所述依赖关系特征为依赖导出特征,生成所述依赖导出代码。
在其中一个实施例中,所述根据所述源代码文件和所述依赖关系代码,生成应用程序,包括:
将所述依赖注入代码添加至所述源代码文件,得到依赖注入文件;
集合所述依赖导出代码,得到依赖导出文件;
针对所述依赖注入文件和所述依赖导出文件,执行核心编译任务,得到所述应用程序。
在其中一个实施例中,所述将所述依赖注入代码添加至所述源代码文件,得到依赖注入文件,包括:
查找所述源代码文件的占位符代码;
将所述依赖注入代码替换所述占位符代码,得到所述依赖注入文件。
在其中一个实施例中,还包括:
确定所述编译任务的核心编译任务;
在执行所述核心编译任务之前,执行所述收集源代码文件的步骤。
在其中一个实施例中,所述解析所述源代码文件,得到依赖关系特征,包括:
建立所述源代码文件的语法树;
提取所述语法树的语法节点;
判断所述语法节点是否存在依赖根节点;所述依赖根节点为另一语法树上的、与所述语法节点具有依赖关系的根语法节点;
若是,根据所述语法节点与所述依赖根节点之间的依赖关系,获取所述依赖关系特征。
第二方面,提供了一种依赖注入装置,包括:
文件收集模块,用于在进行程序编译时,收集源代码文件;
文件解析模块,用于解析所述源代码文件,得到依赖关系特征;
代码生成模块,用于生成所述依赖关系特征的依赖关系代码;
程序生成模块,用于根据所述源代码文件和所述依赖关系代码,生成应用程序,供用户端运行所述应用程序时,执行所述依赖关系代码得到所述应用程序的依赖关系。
在其中一个实施例中,所述依赖关系代码包括依赖注入代码和依赖导出代码,所述代码生成模块,具体用于:
当所述依赖关系特征为依赖注入特征,生成所述依赖注入代码;
当所述依赖关系特征为依赖导出特征,生成所述依赖导出代码。
第三方面,提供了一种依赖注入设备,其特征在于,包括:存储器、一个或多个处理器;
所述存储器,用于存储一个或多个程序;
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如下操作:
在进行程序编译时,收集源代码文件;
解析所述源代码文件,得到依赖关系特征;
生成所述依赖关系特征的依赖关系代码;
根据所述源代码文件和所述依赖关系代码,生成应用程序,供用户端运行所述应用程序时,执行所述依赖关系代码得到所述应用程序的依赖关系。
第四方面,提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:
在进行程序编译时,收集源代码文件;
解析所述源代码文件,得到依赖关系特征;
生成所述依赖关系特征的依赖关系代码;
根据所述源代码文件和所述依赖关系代码,生成应用程序,供用户端运行所述应用程序时,执行所述依赖关系代码得到所述应用程序的依赖关系。
上述依赖注入方法、装置、计算机设备和存储介质,通过在进行程序编译时收集源代码文件,解析源代码文件得到依赖关系特征,生成依赖关系特征的依赖关系代码,并根据源代码文件和依赖关系代码,生成应用程序,从而使得用户端运行应用程序时,通过执行依赖关系代码的方式,即可得到应用程序的依赖关系,避免了用户端在运行应用程序时进行反射处理所导致的用户端顿卡、响应迟钝的问题。
附图说明
图1是本申请实施例一提供的一种依赖注入方法的流程图;
图2是一种模块依赖关系的示意图;
图3是本申请实施例的一种依赖注入方法耗时比对的示意图;
图4是本申请实施例二提供的一种依赖注入方法的流程图;
图5a是一种程序编译的多个编译任务的示意图;
图5b是一种程序编译的编译任务排序的示意图;
图6是本申请实施例的一种依赖注入流程示例的示意图;
图7是本申请实施例三提供的一种依赖注入装置的结构示意图;
图8是本申请实施例四提供的一种依赖注入设备的结构示意图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
实施例一
图1是本申请实施例一提供的一种依赖注入方法的流程图。
本实施例提供的依赖注入方法可以由程序开发端执行,该程序开发端可以通过软件和/或硬件的方式实现,该程序开发端可以是两个或多个物理实体构成,也可以是一个物理实体构成。
首先需要说明,应用程序可以包含有多个模块,模块之间存在依赖关系。这样的依赖关系在大型应用程序中,可能会导致程序不稳定。例如,当某个模块A依赖于模块B,模块B的修改,导致模块A也需要随之修改,或者模块A的行为也需要随之改变。随着应用程序的功能增多,应用程序会有越来越多的模块,模块之间的依赖关系将使得应用程序变得不稳定。图2是一种模块依赖关系的示意图。如图所示,多个模块之间存在交错的依赖关系,其中一个模块的变动,则可能影响到大量的存在依赖关系的模块,并引起连锁反应。如果某个模块变动,而没有相应改动其他依赖的模块,则会导致程序运行错误。
为了解决由于大量依赖关系导致程序不稳定的问题,现有技术中通过依赖注入框架的反射机制,避免模块之间的直至依赖。反射处理可以为程序在运行时提供程序的元数据信息,元数据信息包含有模块之间的依赖关系,依赖注入框架使用反射注入依赖关系。但是,用户端在程序运行时进行反射处理以注入依赖关系,需要首先读取程序文件中元数据信息,然后解析元数据信息,从元数据信息中解析出应用程序可以处理的类型信息,并动态生成CPU指令,执行依赖导出、依赖注入等的逻辑,该过程中每一个步骤都,均会占用用户端大量的处理资源,使得该处理相当耗时。
具体的,参考图1,本申请实施例一的依赖注入方法,具体包括:
步骤S110,在进行程序编译时,收集源代码文件。
其中,程序编译可以为程序开发过程中的编译源代码文件的处理。
其中,源代码文件可以为生成应用程序的代码的集合。
具体实现中,可以将需要编译的源代码文件集合输入至程序开发端。一个程序开发项目可以包含有大量的源代码文件,从而形成一个源代码文件集合。程序开发端在进行程序编译时,从源代码文件集合中,取出一个或多个源代码文件,以进行后续的代码静态分析,在针对当前取出的源代码文件进行代码静态分析完毕后,再取出下一个或多个源代码文件,直至遍历源代码文件集合。
步骤S120,解析所述源代码文件,得到依赖关系特征。
其中,依赖关系特征可以为表征应用程序中各个功能模块之间依赖关系的特征。应用程序的功能模块可以为代码的集合。例如,应用程序包括功能模块01和功能模块02,实现功能模块01的代码片段中,可以包含特定的代码标记,以标识功能模块01的实现依赖于功能模块02,该代码标识所标识的依赖关系,即上述的依赖关系特征。
具体实现中,程序开发端可以通过多种方式对源代码文件进行解析,以得到依赖关系特征。例如,可以首先建立源代码文件的语法树,遍历语法树的语法节点(SyntaxNode),根据该语法节点与另一源代码文件的编译单元(Compilation Unit)之间存在依赖关系,则根据该依赖关系,获取依赖关系特征。又例如,可以直接对源代码文件进行字符串分析,在源代码文件中解析出依赖关系特征。
当然,本领域技术人员可以根据实际情况采用多种解析方式,以解析出源代码文件中的依赖关系特征,本申请实施例对具体的解析方式不作限制。
上述的收集源代码文件、解析源代码文件得到依赖关系特征的处理,可以称为代码静态分析。通过代码静态分析,可以遍历源代码文件集合,得到依赖关系特征。
步骤S130,生成所述依赖关系特征的依赖关系代码。
其中,依赖关系代码可以为在执行后确定应用程序各个功能模块之间的依赖关系的代码。
具体实现中,程序开发端可以针对不同的依赖关系特征,生成对应的依赖关系代码。
需要说明的是,源代码文件中可以包含有依赖注入特征和/或依赖导出特征。例如,当前有ABCDE五个源代码文件,源代码文件A和D分别依赖IB和IE,源代码文件A和D中,分别记录有依赖注入特征IB导入和IE导入。而源代码文件B和E分别提供IB和IE,源代码文件B和E中,分别记录有依赖导出特征IB导出和IE导出。相应地,在依赖关系代码的生成处理中,针对依赖注入特征,则可以生成依赖注入代码,而针对依赖导出特征,则可以生成依赖导出代码。
步骤S140,根据所述源代码文件和所述依赖关系代码,生成应用程序,供用户端运行所述应用程序时,执行所述依赖关系代码得到所述应用程序的依赖关系。
具体实现中,程序开发端在得到依赖注入代码和依赖导出代码之后,可以将依赖注入代码插入至源代码文件中,得到依赖注入文件,对于依赖导出代码,则可以单独生成一个依赖导出文件,记录全部依赖导出代码。从而,得到了依赖注入文件和依赖导出文件,并继续进行核心编译任务,以得到应用程序。用户端在运行应用程序时,则可以通过执行依赖注入文件中的依赖注入代码,确定某个功能模块需要依赖的功能模块,而通过执行依赖导出文件中的依赖导出代码,获取被依赖的功能模块。
例如,将依赖注入代码插入至源代码文件A和D中,得到依赖注入文件A`和D`,集合根据源代码文件B和E生成的依赖导出代码,得到依赖导出文件X,由此,根据文件ABCDE,得到文件A`BCD`EX,针对文件A`BCD`EX执行核心编译任务,得到应用程序。用户端在运行应用程序时,执行文件A`和D`中的依赖注入代码,确定某个功能模块依赖于IB和IE,而执行文件X中的依赖导出代码,获取IB和IE,而IB和IE重定向了获取B和E的过程,由此确定了A和B之间的依赖关系,和D和E之间的依赖关系。
上述的将依赖注入代码插入至源代码文件、集合依赖导出代码的处理,可以称为依赖注入。通过依赖注入,使得应用程序在运行时可以通过执行业务代码的方式确定应用程序中各功能模块的依赖关系。由于本申请实施例已经在应用程序中注入了依赖关系代码,用户端只需要执行依赖关系代码即可得到依赖关系,而无需通过反射处理得到依赖关系。因此,本申请实施例相比起反射处理得到依赖关系的方式,可以节省用户端的处理时间。
图3是本申请实施例的一种依赖注入方法耗时比对的示意图。如图所示,包括两条横向矩形,矩形的长短与耗时为线性正相关。上面的矩形代表基于现有技术的依赖注入方法的程序编译、运行期间耗时情况,下面的矩形代表基于本申请实施例的依赖注入方法的程序编译、运行期间耗时情况。现有技术中,应用程序的编译期间和运行期间均需要一定的耗时,通过本申请实施例的依赖注入方法,虽然在编译期间插入了一段静态分析的处理过程,但是由于静态分析是在应用开发端进行,并不占用用户端的处理资源,因此在用户端运行应用程序时,运行期间的耗时将会大幅度减少。
本申请实施例提供的技术方案,通过在进行程序编译时收集源代码文件,解析源代码文件得到依赖关系特征,生成依赖关系特征的依赖关系代码,并根据源代码文件和依赖关系代码,生成应用程序,从而使得用户端运行应用程序时,通过执行依赖关系代码的方式,即可得到应用程序的依赖关系,避免了用户端在运行应用程序时进行反射处理所导致的用户端顿卡、响应迟钝的问题。
实施例二
图4是本申请实施例二提供的一种依赖注入方法的流程图,本实施例提供的依赖注入方法可以由程序开发端执行,具体包括:
步骤S210,在进行程序编译时,确定所述编译任务的核心编译任务。
其中,核心编译任务可以为将源代码文件转换成应用程序或库的编译任务。
具体实现中,程序编译由大量的编译任务组成,编译任务中包含有将源代码文件转换成应用程序或库的编译任务,将其作为核心编译任务。
步骤S220,在执行所述核心编译任务之前,收集源代码文件。
具体实现中,不同的编译任务之间具有执行顺序,而核心编译任务是将源代码文件转换成应用程序或库的编译任务,由于需要在执行核心编译任务之前,针对源代码文件注入依赖关系代码,因此,需要在执行核心编译任务之前,建立一个任务,通过执行该任务,实现本申请实施例的依赖注入方法,以将依赖关系代码注入至源代码文件中。
图5a是一种程序编译的多个编译任务的示意图。如图所示,程序编译由核心编译任务、编译任务A、编译任务B…等多个编译任务组成。
图5b是一种程序编译的编译任务排序的示意图。如图所示,在确定核心编译任务后,可以在执行核心编译任务之前,进行本申请实施例的静态分析和依赖注入的处理,以实现本申请实施例的依赖注入方法。
步骤S230,解析所述源代码文件,得到依赖关系特征。
在一个实施例中,所述步骤S230,包括:
建立所述源代码文件的语法树;提取所述语法树的语法节点;判断所述语法节点是否存在依赖根节点;所述依赖根节点为另一语法树上的、与所述语法节点具有依赖关系的根语法节点;若是,根据所述语法节点与所述依赖根节点之间的依赖关系,获取所述依赖关系特征。
具体实现中,程序开发端可以读取整个源代码文件,根据读取的结果,建立语法树。然后,遍历语法树的语法节点,当该语法节点与另一源代码文件的编译单元之间存在依赖关系,则可以根据该依赖关系获取依赖关系特征。更具体地,判断某个语法节点与另一个源代码文件的语法树的根语法节点之间是否存在依赖关系,若是,则可以将该根语法节点作为上述的依赖根节点,并根据语法节点与依赖根节点之间的依赖关系,获取依赖关系特征。
例如,对于C#(一种高级程序设计语言)语言的语法树,可以以Attribute作为依赖关系特征,对于JAVA(一种高级程序设计语言)语言的语法树,可以以Annotation作为依赖关系特征。
如果直接针对源代码文件进行字符串分析,会导致需要对源代码文件的细节进行大量分析,影响处理效率。在本申请实施例中,通过建立语法树的方式解析源代码文件,得到依赖关系特征,简化了处理过程,避免了字符串分析对源代码文件的细节进行大量分析、影响处理效率的问题,提升了依赖注入的效率。
步骤S240,生成所述依赖关系特征的依赖关系代码。
在一个实施例中,所述依赖关系代码包括依赖注入代码和依赖导出代码,所述步骤S240,包括:
当所述依赖关系特征为依赖注入特征,生成所述依赖注入代码;当所述依赖关系特征为依赖导出特征,生成所述依赖导出代码。
具体实现中,依赖关系特征可以分为依赖注入特征和依赖导出特征。对于依赖注入特征,则可以相应生成依赖注入代码,对于依赖导出特征,则可以相应生成依赖导出代码。
步骤S250,根据所述源代码文件和所述依赖关系代码,生成应用程序,供用户端运行所述应用程序时,执行所述依赖关系代码得到所述应用程序的依赖关系。
在一个实施例中,所述步骤S250,包括:
将所述依赖注入代码添加至所述源代码文件,得到依赖注入文件;集合所述依赖导出代码,得到依赖导出文件;针对所述依赖注入文件和所述依赖导出文件,执行核心编译任务,得到所述应用程序。
具体实现中,源代码文件中可能只包含有依赖注入特征,也可能只包含有依赖导出特征,也可能同时包含依赖注入特征和依赖导出特征,也可能不包含有依赖注入特征或依赖导出特征。针对不同的情况,可以进行不同的处理。
对于只包含有依赖注入特征的源代码文件,则可以将依赖注入代码添加至该源代码文件,得到依赖注入文件,并删除原来的源代码文件。对于只包含有依赖导出特征的源代码文件,则可以将依赖导出代码统一记录成一个依赖导出文件,并保留原来的源代码文件。对于同时包含依赖注入特征和依赖导出特征的源代码文件,则需要将依赖注入代码添加至该源代码文件,得到依赖注入文件,并删除原来的源代码文件,同时,将依赖导出代码统一记录成一个依赖导出文。对于不包含有依赖注入特征或依赖导出特征的源代码文件,则无须进行处理。
在一个实施例中,所述将所述依赖注入代码添加至所述源代码文件,得到依赖注入文件,包括:
查找所述源代码文件的占位符代码;将所述依赖注入代码替换所述占位符代码,得到所述依赖注入文件。
具体实现中,可以首先查找源代码文件中与依赖关系特征对应的占位符代码,然后,将根据该依赖关系特征生成的依赖注入代码,替换该占位符代码,得到依赖注入文件。
为了便于本领域技术人员理解本申请实施例,以下将结合具体示例进行说明。图6是本申请实施例的一种依赖注入流程示例的示意图。如图所示,首先从一个源代码文件集合中分离多个源代码文件,然后遍历各个源代码文件,解析源代码文件,判断源代码文件中是否包含有依赖关系特征。上述的处理过程即为静态分析过程。
对于只包含有依赖注入特征的源代码文件,则可以将依赖注入代码替换该源代码文件的占位符代码,得到依赖注入文件并保存,并删除原来的源代码文件。对于只包含有依赖导出特征的源代码文件,则可以将依赖导出代码统一记录成一个依赖导出文件,并保留原来的源代码文件。对于不包含有依赖注入特征或依赖导出特征的源代码文件,则无须进行处理。上述的处理过程即为依赖注入过程。
针对当前的源代码文件进行了上述的静态分析、依赖注入过程之后,返回至判断源代码文件是否遍历完成的步骤,直至所有的源代码文件均进行静态分析、依赖注入过程。当所有的源代码文件均进行静态分析、依赖注入过程之后,本申请的依赖注入完毕,将得到的依赖注入文件、依赖导出文件、未修改的源代码文件,作为修改后的源代码文件集合,传入至核心编译任务,得到最终的应用程序。
应该理解的是,虽然图1和图4的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图1和图4中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
实施例三
图7是本申请实施例三提供的一种依赖注入装置的结构示意图。参考图7,本实施例提供的依赖注入装置具体包括:文件收集模块310、文件解析模块320、代码生成模块330和程序生成模块340;其中:
文件收集模块310,用于在进行程序编译时,收集源代码文件;
文件解析模块320,用于解析所述源代码文件,得到依赖关系特征;
代码生成模块330,用于生成所述依赖关系特征的依赖关系代码;
程序生成模块340,用于根据所述源代码文件和所述依赖关系代码,生成应用程序,供用户端运行所述应用程序时,执行所述依赖关系代码得到所述应用程序的依赖关系。
本申请实施例提供的技术方案,通过在进行程序编译时收集源代码文件,解析源代码文件得到依赖关系特征,生成依赖关系特征的依赖关系代码,并根据源代码文件和依赖关系代码,生成应用程序,从而使得用户端运行应用程序时,通过执行依赖关系代码的方式,即可得到应用程序的依赖关系,避免了用户端在运行应用程序时进行反射处理所导致的用户端顿卡、响应迟钝的问题。
在上述实施例的基础上,所述依赖关系代码包括依赖注入代码和依赖导出代码,所述代码生成模块330,具体用于:
当所述依赖关系特征为依赖注入特征,生成所述依赖注入代码;
当所述依赖关系特征为依赖导出特征,生成所述依赖导出代码。
在上述实施例的基础上,所述程序生成模块340,包括:
代码添加子模块,用于将所述依赖注入代码添加至所述源代码文件,得到依赖注入文件;
代码集合子模块,用于集合所述依赖导出代码,得到依赖导出文件;
编译子模块,用于针对所述依赖注入文件和所述依赖导出文件,执行核心编译任务,得到所述应用程序。
在上述实施例的基础上,所述代码添加子模块,包括:
占位符查找单元,用于查找所述源代码文件的占位符代码;
替换单元,用于将所述依赖注入代码替换所述占位符代码,得到所述依赖注入文件。
在上述实施例的基础上,所述文件收集模块310,具体用于:
确定所述编译任务的核心编译任务,并在执行所述核心编译任务之前,收集源代码文件。
在上述实施例的基础上,所述文件解析模块320,包括:
语法树建立子模块,用于建立所述源代码文件的语法树;
节点提取子模块,用于提取所述语法树的语法节点;
判断子模块,用于判断所述语法节点是否存在依赖根节点;所述依赖根节点为另一语法树上的、与所述语法节点具有依赖关系的根语法节点;
特征获取子模块,用于根据所述语法节点与所述依赖根节点之间的依赖关系,获取所述依赖关系特征。
通过本申请实施例提供的技术方案,通过建立语法树的方式解析源代码文件,得到依赖关系特征,简化了处理过程,避免了字符串分析对源代码文件的细节进行大量分析、影响处理效率的问题,提升了依赖注入的效率。
上述提供的依赖注入装置可用于执行上述任意实施例提供的依赖注入方法,具备相应的功能和有益效果。
关于依赖注入装置的具体限定可以参见上文中对于依赖注入方法的限定,在此不再赘述。上述依赖注入装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
实施例四
图8是本申请实施例四提供的一种依赖注入设备的结构示意图。如图中所示,该依赖注入设备包括:处理器40、存储器41、具有触摸功能的显示屏42、输入装置43、输出装置44以及通信装置45。该依赖注入设备中处理器40的数量可以是一个或者多个,图中以一个处理器40为例。该依赖注入设备中存储器41的数量可以是一个或者多个,图中以一个存储器41为例。该依赖注入设备的处理器40、存储器41、显示屏42、输入装置43、输出装置44以及通信装置45可以通过总线或者其他方式连接,图中以通过总线连接为例。实施例中,依赖注入设备可以是电脑,手机,平板,投影仪或交互智能平板等。实施例中,以依赖注入设备为交互智能平板为例,进行描述。
存储器41作为一种计算机可读存储介质,可用于存储软件程序、计算机可执行程序以及模块,如本申请任意实施例所述的依赖注入方法对应的程序指令/模块。存储器41可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据设备的使用所创建的数据等。此外,存储器41可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实例中,存储器41可进一步包括相对于处理器40远程设置的存储器,这些远程存储器可以通过网络连接至设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
显示屏42为具有触摸功能的显示屏42,其可以是电容屏、电磁屏或者红外屏。一般而言,显示屏42用于根据处理器40的指示显示数据,还用于接收作用于显示屏42的触摸操作,并将相应的信号发送至处理器40或其他装置。可选的,当显示屏42为红外屏时,其还包括红外触摸框,该红外触摸框设置在显示屏42的四周,其还可以用于接收红外信号,并将该红外信号发送至处理器40或者其他设备。
通信装置45,用于与其他设备建立通信连接,其可以是有线通信装置和/或无线通信装置。
输入装置43可用于接收输入的数字或者字符信息,以及产生与依赖注入设备的用户设置以及功能控制有关的键信号输入,还可以是用于获取图像的摄像头以及获取音频数据的拾音设备。输出装置44可以包括扬声器等音频设备。需要说明的是,输入装置43和输出装置44的具体组成可以根据实际情况设定。
处理器40通过运行存储在存储器41中的软件程序、指令以及模块,从而执行设备的各种功能应用以及数据处理,即实现上述的依赖注入方法。
具体的,实施例中,处理器40执行存储器41中存储的一个或多个程序时,具体实现如下操作:
在进行程序编译时,收集源代码文件;
解析所述源代码文件,得到依赖关系特征;
生成所述依赖关系特征的依赖关系代码;
根据所述源代码文件和所述依赖关系代码,生成应用程序,供用户端运行所述应用程序时,执行所述依赖关系代码得到所述应用程序的依赖关系。
在上述实施例的基础上,一个或多个处理器40还实现如下操作:
当所述依赖关系特征为依赖注入特征,生成所述依赖注入代码;
当所述依赖关系特征为依赖导出特征,生成所述依赖导出代码。
在上述实施例的基础上,一个或多个处理器40还实现如下操作:
将所述依赖注入代码添加至所述源代码文件,得到依赖注入文件;
集合所述依赖导出代码,得到依赖导出文件;
针对所述依赖注入文件和所述依赖导出文件,执行核心编译任务,得到所述应用程序。
在上述实施例的基础上,一个或多个处理器40还实现如下操作:
查找所述源代码文件的占位符代码;
将所述依赖注入代码替换所述占位符代码,得到所述依赖注入文件。
在上述实施例的基础上,一个或多个处理器40还实现如下操作:
确定所述编译任务的核心编译任务;
在执行所述核心编译任务之前,执行所述收集源代码文件的步骤。
在上述实施例的基础上,一个或多个处理器40还实现如下操作:
建立所述源代码文件的语法树;
提取所述语法树的语法节点;
判断所述语法节点是否存在依赖根节点;所述依赖根节点为另一语法树上的、与所述语法节点具有依赖关系的根语法节点;
若是,根据所述语法节点与所述依赖根节点之间的依赖关系,获取所述依赖关系特征。
实施例五
本申请实施例五还提供一种包含计算机可执行指令的存储介质,所述计算机可执行指令在由计算机处理器执行时用于执行一种依赖注入方法,包括:
在进行程序编译时,收集源代码文件;
解析所述源代码文件,得到依赖关系特征;
生成所述依赖关系特征的依赖关系代码;
根据所述源代码文件和所述依赖关系代码,生成应用程序,供用户端运行所述应用程序时,执行所述依赖关系代码得到所述应用程序的依赖关系。
当然,本申请实施例所提供的一种包含计算机可执行指令的存储介质,其计算机可执行指令不限于如上所述的依赖注入方法操作,还可以执行本申请任意实施例所提供的依赖注入方法中的相关操作,且具备相应的功能和有益效果。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink)DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。
Claims (10)
1.一种依赖注入方法,其特征在于,包括:
在进行程序编译时,收集源代码文件;
解析所述源代码文件,得到依赖关系特征;
生成所述依赖关系特征的依赖关系代码;
根据所述源代码文件和所述依赖关系代码,生成应用程序,供用户端运行所述应用程序时,执行所述依赖关系代码得到所述应用程序的依赖关系。
2.根据权利要求1所述的方法,其特征在于,所述依赖关系代码包括依赖注入代码和依赖导出代码,所述生成所述依赖关系特征的依赖关系代码,包括:
当所述依赖关系特征为依赖注入特征,生成所述依赖注入代码;
当所述依赖关系特征为依赖导出特征,生成所述依赖导出代码。
3.根据权利要求2所述的方法,其特征在于,所述根据所述源代码文件和所述依赖关系代码,生成应用程序,包括:
将所述依赖注入代码添加至所述源代码文件,得到依赖注入文件;
集合所述依赖导出代码,得到依赖导出文件;
针对所述依赖注入文件和所述依赖导出文件,执行核心编译任务,得到所述应用程序。
4.根据权利要求3所述的方法,其特征在于,所述将所述依赖注入代码添加至所述源代码文件,得到依赖注入文件,包括:
查找所述源代码文件的占位符代码;
将所述依赖注入代码替换所述占位符代码,得到所述依赖注入文件。
5.根据权利要求1所述的方法,其特征在于,还包括:
确定所述编译任务的核心编译任务;
在执行所述核心编译任务之前,执行所述收集源代码文件的步骤。
6.根据权利要求1所述的方法,其特征在于,所述解析所述源代码文件,得到依赖关系特征,包括:
建立所述源代码文件的语法树;
提取所述语法树的语法节点;
判断所述语法节点是否存在依赖根节点;所述依赖根节点为另一语法树上的、与所述语法节点具有依赖关系的根语法节点;
若是,根据所述语法节点与所述依赖根节点之间的依赖关系,获取所述依赖关系特征。
7.一种依赖注入装置,其特征在于,包括:
文件收集模块,用于在进行程序编译时,收集源代码文件;
文件解析模块,用于解析所述源代码文件,得到依赖关系特征;
代码生成模块,用于生成所述依赖关系特征的依赖关系代码;
程序生成模块,用于根据所述源代码文件和所述依赖关系代码,生成应用程序,供用户端运行所述应用程序时,执行所述依赖关系代码得到所述应用程序的依赖关系。
8.根据权利要求7所述的依赖注入装置,其特征在于,所述依赖关系代码包括依赖注入代码和依赖导出代码,所述代码生成模块,具体用于:
当所述依赖关系特征为依赖注入特征,生成所述依赖注入代码;
当所述依赖关系特征为依赖导出特征,生成所述依赖导出代码。
9.一种依赖注入设备,其特征在于,包括:存储器、一个或多个处理器;
所述存储器,用于存储一个或多个程序;
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器执行如权利要求1-6中任一所述的依赖注入方法。
10.一种包含计算机可执行指令的存储介质,其特征在于,所述计算机可执行指令在由计算机处理器执行时用于执行如权利要求1-6中任一所述的依赖注入方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811122064.3A CN109388403B (zh) | 2018-09-26 | 2018-09-26 | 依赖注入方法、装置、设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811122064.3A CN109388403B (zh) | 2018-09-26 | 2018-09-26 | 依赖注入方法、装置、设备和存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109388403A true CN109388403A (zh) | 2019-02-26 |
CN109388403B CN109388403B (zh) | 2022-04-05 |
Family
ID=65418152
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811122064.3A Active CN109388403B (zh) | 2018-09-26 | 2018-09-26 | 依赖注入方法、装置、设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109388403B (zh) |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110221820A (zh) * | 2019-04-23 | 2019-09-10 | 平安科技(深圳)有限公司 | spring框架泛型依赖注入方法、装置及计算机设备、存储介质 |
CN110489124A (zh) * | 2019-07-12 | 2019-11-22 | 浙江口碑网络技术有限公司 | 源代码执行方法、装置、存储介质及计算机设备 |
CN111124454A (zh) * | 2019-12-25 | 2020-05-08 | 南京医康科技有限公司 | 镜像构建方法与装置、电子设备、存储介质 |
CN111459499A (zh) * | 2020-04-20 | 2020-07-28 | 网易(杭州)网络有限公司 | 程序编译方法及装置、计算机存储介质、电子设备 |
CN111581207A (zh) * | 2020-04-13 | 2020-08-25 | 深圳市云智融科技有限公司 | Azkaban项目的文件生成方法、装置及终端设备 |
CN112214219A (zh) * | 2019-06-24 | 2021-01-12 | 腾讯科技(深圳)有限公司 | 一种组件处理方法、装置、服务器及存储介质 |
CN112579475A (zh) * | 2020-12-31 | 2021-03-30 | 平安银行股份有限公司 | 代码测试方法、装置、设备及可读存储介质 |
CN113391812A (zh) * | 2020-03-13 | 2021-09-14 | 阿里巴巴集团控股有限公司 | 应用程序模块的分析方法、装置以及分析工具 |
CN113692572A (zh) * | 2020-01-21 | 2021-11-23 | 深圳元戎启行科技有限公司 | 编译方法和装置、计算机设备、计算机可读存储介质 |
CN114610406A (zh) * | 2022-03-02 | 2022-06-10 | 维塔科技(北京)有限公司 | 代码注入方法、装置、存储介质及电子设备 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101251796A (zh) * | 2008-03-31 | 2008-08-27 | 中国船舶重工集团公司第七〇九研究所 | 基于依赖注入的分布式构件依赖关系管理方法 |
CN104991773A (zh) * | 2015-06-30 | 2015-10-21 | 小米科技有限责任公司 | 程序生成方法及装置 |
US20160117154A1 (en) * | 2014-10-23 | 2016-04-28 | Telefonaktiebolaget L M Ericsson (Publ) | Automated software include graph and build environment analysis and optimization in compiled language |
CN106843820A (zh) * | 2015-12-04 | 2017-06-13 | 阿里巴巴集团控股有限公司 | 代码处理方法和装置 |
US20180081644A1 (en) * | 2016-09-17 | 2018-03-22 | Oracle International Corporation | System and method for supporting reactive responses using a dependency injection framework |
CN107832059A (zh) * | 2017-11-21 | 2018-03-23 | 广州视源电子科技股份有限公司 | 一种基于Makefile的代码静态分析方法和装置 |
-
2018
- 2018-09-26 CN CN201811122064.3A patent/CN109388403B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101251796A (zh) * | 2008-03-31 | 2008-08-27 | 中国船舶重工集团公司第七〇九研究所 | 基于依赖注入的分布式构件依赖关系管理方法 |
US20160117154A1 (en) * | 2014-10-23 | 2016-04-28 | Telefonaktiebolaget L M Ericsson (Publ) | Automated software include graph and build environment analysis and optimization in compiled language |
CN104991773A (zh) * | 2015-06-30 | 2015-10-21 | 小米科技有限责任公司 | 程序生成方法及装置 |
CN106843820A (zh) * | 2015-12-04 | 2017-06-13 | 阿里巴巴集团控股有限公司 | 代码处理方法和装置 |
US20180081644A1 (en) * | 2016-09-17 | 2018-03-22 | Oracle International Corporation | System and method for supporting reactive responses using a dependency injection framework |
CN107832059A (zh) * | 2017-11-21 | 2018-03-23 | 广州视源电子科技股份有限公司 | 一种基于Makefile的代码静态分析方法和装置 |
Cited By (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110221820B (zh) * | 2019-04-23 | 2024-05-28 | 平安科技(深圳)有限公司 | spring框架泛型依赖注入方法、装置及计算机设备、存储介质 |
WO2020215686A1 (zh) * | 2019-04-23 | 2020-10-29 | 平安科技(深圳)有限公司 | spring框架泛型依赖注入方法、装置及计算机设备、存储介质 |
CN110221820A (zh) * | 2019-04-23 | 2019-09-10 | 平安科技(深圳)有限公司 | spring框架泛型依赖注入方法、装置及计算机设备、存储介质 |
CN112214219A (zh) * | 2019-06-24 | 2021-01-12 | 腾讯科技(深圳)有限公司 | 一种组件处理方法、装置、服务器及存储介质 |
CN112214219B (zh) * | 2019-06-24 | 2023-11-10 | 腾讯科技(深圳)有限公司 | 一种组件处理方法、装置、服务器及存储介质 |
CN110489124B (zh) * | 2019-07-12 | 2023-06-13 | 浙江口碑网络技术有限公司 | 源代码执行方法、装置、存储介质及计算机设备 |
CN110489124A (zh) * | 2019-07-12 | 2019-11-22 | 浙江口碑网络技术有限公司 | 源代码执行方法、装置、存储介质及计算机设备 |
CN111124454A (zh) * | 2019-12-25 | 2020-05-08 | 南京医康科技有限公司 | 镜像构建方法与装置、电子设备、存储介质 |
CN111124454B (zh) * | 2019-12-25 | 2024-03-19 | 医渡云(北京)技术有限公司 | 镜像构建方法与装置、电子设备、存储介质 |
CN113692572A (zh) * | 2020-01-21 | 2021-11-23 | 深圳元戎启行科技有限公司 | 编译方法和装置、计算机设备、计算机可读存储介质 |
CN113391812A (zh) * | 2020-03-13 | 2021-09-14 | 阿里巴巴集团控股有限公司 | 应用程序模块的分析方法、装置以及分析工具 |
CN111581207B (zh) * | 2020-04-13 | 2023-12-29 | 深圳市云智融科技有限公司 | Azkaban项目的文件生成方法、装置及终端设备 |
CN111581207A (zh) * | 2020-04-13 | 2020-08-25 | 深圳市云智融科技有限公司 | Azkaban项目的文件生成方法、装置及终端设备 |
CN111459499A (zh) * | 2020-04-20 | 2020-07-28 | 网易(杭州)网络有限公司 | 程序编译方法及装置、计算机存储介质、电子设备 |
CN112579475A (zh) * | 2020-12-31 | 2021-03-30 | 平安银行股份有限公司 | 代码测试方法、装置、设备及可读存储介质 |
CN114610406A (zh) * | 2022-03-02 | 2022-06-10 | 维塔科技(北京)有限公司 | 代码注入方法、装置、存储介质及电子设备 |
Also Published As
Publication number | Publication date |
---|---|
CN109388403B (zh) | 2022-04-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109388403A (zh) | 依赖注入方法、装置、设备和存储介质 | |
US11797298B2 (en) | Automating identification of code snippets for library suggestion models | |
CN102819492B (zh) | 一种基于Android的关键字驱动自动化测试框架 | |
CN111752571B (zh) | 程序升级方法、装置、设备及存储介质 | |
CN112394942B (zh) | 基于云计算的分布式软件开发编译方法及软件开发平台 | |
CN111459824B (zh) | 并发服务的测试用例处理方法及装置 | |
CN109032631B (zh) | 应用程序补丁包获取方法、装置、计算机设备及存储介质 | |
US20090328016A1 (en) | Generalized expression trees | |
CN102012857B (zh) | 一种对Web页面进行自动化测试的装置及方法 | |
CN107783766B (zh) | 对应用程序的文件进行清理的方法和装置 | |
US9047100B2 (en) | Abstract syntax tree transformation | |
CN111475150B (zh) | 一种跨语言绑定方法、装置、设备及存储介质 | |
CN110543427A (zh) | 测试用例存储方法、装置、电子设备及存储介质 | |
CN111158665B (zh) | 代码生成方法及装置、电子设备和存储介质 | |
CN111259042A (zh) | 一种动态查询方法及系统 | |
CN113821486B (zh) | pod库之间依赖关系的确定方法及其装置、电子设备 | |
CN103116514A (zh) | 基于系统扩展调用图的操作系统自动优化方法和系统 | |
CN111966358A (zh) | 代码打包方法、装置、电子设备和计算机可读存储介质 | |
CN111399931A (zh) | 一种LayaAir引擎导出UI资源的方法及终端 | |
CN113986322B (zh) | 一种动态修改页面代码的方法、装置及存储介质 | |
CN116775040B (zh) | 实现代码疫苗的插桩方法及基于代码疫苗的应用测试方法 | |
CN114003317B (zh) | 内联实现方法及装置、电子设备、存储介质及程序产品 | |
US20240135210A1 (en) | Replacing lambda expressions in a rete network with corresponding code classes | |
CN113760690A (zh) | 分析程序接口的方法、装置和计算机设备 | |
CN117193731A (zh) | 组件引入的方法、装置、非易失性存储介质和电子设备 |
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 |