Duplicate spring bean id问题排查

本文探讨了Spring Bean ID重复时的默认处理策略——覆盖注册,并指出Dubbo新版本对重复ID采取的异常抛出策略,解释了由此引发的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现象

应用任务运行异常
{code}
Caused by: java.lang.IllegalStateException: Duplicate spring bean id realnameAuthPubService
        at com.alibaba.dubbo.rpc.config.spring.schema.DubboBeanDefinitionParser.parse(DubboBeanDefinitionParser.java:87)
        at com.alibaba.dubbo.rpc.config.spring.schema.DubboBeanDefinitionParser.parse(DubboBeanDefinitionParser.java:63)
        at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:69)
        at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1297)
        at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1287)
        at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:135)
        at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:92)
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:507)
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:398)
{code}

排查


查看代码,确实有id为realnameAuthPubService的重复配置,不过已经存在很久了,之前都没有问题。

问题出现的当天仅有dubbo升级需求发布,所以定位到是dubbo升级引发了这个一直存在的问题

原因



spring对于id重复的默认处理策略是覆盖,如DefaultListableBeanFactory.registerBeanDefinition,dubbo之前没做特殊处理,所以对重复的id会覆盖,所以一直没有报错
{code}
...
synchronized (this.beanDefinitionMap) {
			Object oldBeanDefinition = this.beanDefinitionMap.get(beanName);
			if (oldBeanDefinition != null) {
                                ##allowBeanDefinitionOverriding默认值为ture
				if (!this.allowBeanDefinitionOverriding) {
					throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,
							"Cannot register bean definition [" + beanDefinition + "] for bean '" + beanName +
							"': There is already [" + oldBeanDefinition + "] bound.");
				}
				else {
					if (this.logger.isInfoEnabled()) {
						this.logger.info("Overriding bean definition for bean '" + beanName +
								"': replacing [" + oldBeanDefinition + "] with [" + beanDefinition + "]");
					}
				}
			}
			else {
				this.beanDefinitionNames.add(beanName);
				this.frozenBeanDefinitionNames = null;
			}
                        ##如果原来有,覆盖
			this.beanDefinitionMap.put(beanName, beanDefinition);
...
{code}
dubbo的新版本对重复的id做了特殊处理,如果有重复直接抛异常,所以出现问题
{code}
DubboBeanDefinitionParser.parse


   private BeanDefinition parse(Element element, ParserContext parserContext, Class<?> beanClass, boolean required) {
        ...
        if (id != null && id.length() > 0) {
            ###判断是否已经存在,存在则抛出异常
            if (parserContext.getRegistry().containsBeanDefinition(id))  {
        		throw new IllegalStateException("Duplicate spring bean id " + id);
        	}
            parserContext.getRegistry().registerBeanDefinition(id, beanDefinition);
        }
        ...
   }
{code}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值