【技术实现步骤摘要】
一种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的改写,但是需要在所有需要改名的节点标签中都 ...
【技术保护点】
【技术特征摘要】
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...
【专利技术属性】
技术研发人员:蓝磊芳,蔡博文,
申请(专利权)人:远光软件股份有限公司,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。