一种SpringBean组件ID冲突的解决方法和装置制造方法及图纸

技术编号:35927622 阅读:56 留言:0更新日期:2022-12-14 10:11
本发明专利技术涉及一种Spring Bean组件ID冲突的解决方法和装置,属于组件开发技术领域,解决了现有对Bean组件ID无法自动识别冲突以及无法灵活命名的问题。包括:执行命名生成器中的扫描程序,遍历项目目录下所有编译后文件,将文件目录和文件名拼装得到全限定类名放入子集中,将文件名及其对应的子集组成键值对放入类信息集合中;每次遍历将相同文件名对应的全限定类名放入同一个子集;遍历类信息集合,取出长度大于1的子集放入黑名单集合中;Spring加载Bean组件,执行命名生成器中的命名程序,当组件的全限定类名存在于黑名单集合中,且不存在于白名单集合中时,根据预设规则生成Bean组件ID。实现了主动识别和插拔式解决冲突Bean组件ID,覆盖面广,处理灵活。处理灵活。处理灵活。

【技术实现步骤摘要】
一种Spring Bean组件ID冲突的解决方法和装置


[0001]本专利技术涉及组件开发
,尤其涉及一种Spring Bean组件ID冲突的解决方法和装置。

技术介绍

[0002]为了解决系统过于庞大而不便于开发维护,通常都会将大系统拆分为多个微服务,或者是将单个应用拆分为多个模块多团队开发,在集成测试时再融合在一起,以便提高系统灵活性且节省机器资源。采用Spring框架开发,Bean组件的ID缺省根据类名生成,在这种开发分散、运行合并的模式下,不同目录下的同名类生成的Bean组件ID相同,导致冲突,影响程序正常运行。
[0003]Spring框架在处理有重名的Bean组件时缺省使用的是覆盖(override)方式,只有在执行方法时才会发现错误,虽然可以通过修改配置不采用覆盖方式,但也只是把报错提前在服务启动环节,最后还是需要根据报出的错误信息定位问题后,人工修改重名的Bean组件ID。
[0004]Spring原生框架支持对普通组件重写Bean组件命名生成器,但对类似于JPA(Java Persistence API,Java持久层API)的框架内的组件扫描则不支持;虽然对普通组件可以在<context:component

scan/>节点中增加name

generator属性,在@ComponentScan中增加nameGenerator属性来调用扩展的命名类实现Bean组件ID的改写,但是需要在所有需要改名的节点标签中都增加属性,而且一旦要修改或删除,就需要整体搜索,操作的工作量大和遗漏的风险都比较大;对于历史模块代码,或者强依赖Bean组件ID的特殊情况也无法灵活处理。

技术实现思路

[0005]鉴于上述的分析,本专利技术实施例旨在提供一种Spring Bean组件ID冲突的解决方法和装置,用以解决现有无法自动识别冲突的Bean组件ID以及无法灵活命名Bean组件的问题。
[0006]一方面,本专利技术实施例提供了一种Spring Bean组件ID冲突的解决方法,包括如下步骤:
[0007]执行命名生成器中的扫描程序,获取项目目录下所有编译后文件;
[0008]遍历编译后文件,获取文件目录和文件名,将文件目录和文件名拼装得到的全限定类名放入子集中,以及,将文件名及其对应的子集组成键值对放入类信息集合中;其中,每次遍历将相同文件名对应的全限定类名放入同一个子集;
[0009]遍历类信息集合,取出长度大于1的子集放入黑名单集合中;
[0010]Spring加载Bean组件,执行命名生成器中的命名程序,取出当前Bean组件的全限定类名,当Bean组件的全限定类名存在于黑名单集合中,且不存在于白名单集合中时,根据预设规则生成Bean组件ID。
[0011]基于上述方法的进一步改进,命名生成器继承AnnotationBeanNameGenerator类,包括扫描程序和命名程序,其中:
[0012]扫描程序存储在静态块中,当创建命名生成器实例时自动执行扫描程序,用来扫描所有编译后文件,生成黑名单集合和白名单集合;
[0013]命名程序重写buildDefaultBeanName方法,用于识别Bean组件的ID是否冲突,对冲突的Bean组件根据预设规则生成Bean组件ID,其中预设规则是“beanId_全限定类名”。
[0014]基于上述方法的进一步改进,命名生成器用于对XML配置方式和注解方式定义的组件进行扫描和命名,其中XML配置方式包括:<context:component

scan/>,<jpa:repositories/>,注解方式包括:@ComponentScan。
[0015]基于上述方法的进一步改进,对XML配置方式,当Spring解析配置文件中的context和jpa标签时,根据spring.handlers文件中的配置,分别找到与标签命名空间相同的context标签处理器和jpa标签处理器,在context标签处理器和jpa标签处理器中的初始化方法中创建context扫描解析器和jpa扫描解析器,根据context扫描解析器和jpa扫描解析器中设置的命名生成器,创建命名生成器实例。
[0016]基于上述方法的进一步改进,对注解方式,当Spring根据@ComponentScan扫描组件时,调用实现内置接口的动态组件注册器,在动态组件注册器中获取组件工厂后置处理器,创建命名生成器实例。
[0017]基于上述方法的进一步改进,黑名单集合中还包括通过读取预置的黑名单文件获得的黑名单;黑名单文件和白名单文件存放在项目META

INF文件夹下,文件内容支持全限定类名和末尾是*的通配符形式。
[0018]基于上述方法的进一步改进,所有编译后文件,包括class文件和jar文件,对jar文件,通过遍历取出其中所包含的class文件。
[0019]基于上述方法的进一步改进,根据预设规则生成Bean组件ID时,将当前Bean组件的全限定类名放入命名组件集合中,全部执行完毕后,将根据黑名单集合统计得到的冲突Bean组件总数量、根据命名组件集合统计得到的命名Bean组件数量和明细,输出在日志和/或文件中。
[0020]另一方面,本专利技术实施例提供了一种Spring Bean组件ID冲突的解决装置,包括命名生成器、context扫描解析器、jpa扫描解析器、context标签处理器、jpa标签处理器、动态组件注册器、配置文件和数据统计模块,其中,
[0021]命名生成器,继承AnnotationBeanNameGenerator类,包括扫描程序和命名程序,其中,扫描程序放在静态块中,当创建命名生成器实例时会自动执行扫描程序,用来扫描所有编译后文件,生成黑名单集合和白名单集合;命名程序重写buildDefaultBeanName方法,用于识别Bean组件的ID是否冲突,对冲突的Bean组件根据预设规则生成Bean组件ID,其中预设规则是“beanId_全限定类名”;
[0022]context扫描解析器,用来覆盖内置的component

scan标签的扫描解析器,调用命名生成器;
[0023]jpa扫描解析器,用来增加jpa标签的扫描解析器,调用命名生成器;
[0024]context标签处理器,用来定义Spring解析配置文件中<context:component

scan/>标签时的处理器,在初始化方法中调用context扫描解析器;
[0025]jpa标签处理器,用来定义解析配置文件中<jpa:repositories/>标签的处理器,在初始化方法中调用jpa扫描解析器;
[0026]动态组件注册器,实现内置本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种Spring Bean组件ID冲突的解决方法,其特征在于,包括如下步骤:执行命名生成器中的扫描程序,获取项目目录下所有编译后文件;遍历所述编译后文件,获取文件目录和文件名,将所述文件目录和所述文件名拼装得到的全限定类名放入子集中,以及,将所述文件名及其对应的子集组成键值对放入类信息集合中;其中,每次遍历将相同文件名对应的全限定类名放入同一个子集;遍历所述类信息集合,取出长度大于1的子集放入黑名单集合中;Spring加载Bean组件,执行命名生成器中的命名程序,取出当前Bean组件的全限定类名,当所述Bean组件的全限定类名存在于所述黑名单集合中,且不存在于白名单集合中时,根据预设规则生成Bean组件ID。2.根据权利要求1所述的Spring Bean组件ID冲突的解决方法,其特征在于,所述命名生成器继承AnnotationBeanNameGenerator类,包括所述扫描程序和所述命名程序,其中:所述扫描程序存储在静态块中,当创建所述命名生成器实例时自动执行所述扫描程序,用来扫描所有编译后文件,生成所述黑名单集合和所述白名单集合;所述命名程序重写buildDefaultBeanName方法,用于识别Bean组件的ID是否冲突,对冲突的Bean组件根据所述预设规则生成Bean组件ID,其中所述预设规则是“beanId_全限定类名”。3.根据权利要求2所述的Spring Bean组件ID冲突的解决方法,其特征在于,所述命名生成器用于对XML配置方式和注解方式定义的组件进行扫描和命名,其中XML配置方式包括:<context:component

scan/>,<jpa:repositories/>,注解方式包括:@ComponentScan。4.根据权利要求3所述的Spring Bean组件ID冲突的解决方法,其特征在于,对所述XML配置方式,当Spring解析配置文件中的context和jpa标签时,根据spring.handlers文件中的配置,分别找到与标签命名空间相同的context标签处理器和jpa标签处理器,在context标签处理器和jpa标签处理器中的初始化方法中创建context扫描解析器和jpa扫描解析器,根据所述context扫描解析器和所述jpa扫描解析器中设置的命名生成器,创建所述命名生成器实例。5.根据权利要求3所述的Spring Bean组件ID冲突的解决方法,其特征在于,对所述注解方式,当Spring根据@ComponentScan扫描组件时,调用实现内置接口的动态组件注册器,在所述动态组件注册器中获取组件工厂后置处理器,创建所述命名生成器实例。6.根据权利要求1

5任一项所述的Spring Bean组件ID冲突的解决方法,其特征在于,所述黑名单集合中还包括通过读取预置的黑名单文件获得的黑名单;所述黑名单文件和所述白名单文件存放在项目META

INF文件夹下,文件内容支持全限定类名和末尾是*的通配符形式。7.根据权利要求1所述的Spring Bean组件ID冲突的解决方法,其特征在于,所述所有编译后文件,包括class文件和j...

【专利技术属性】
技术研发人员:蓝磊芳蔡博文
申请(专利权)人:远光软件股份有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1