This is an automated email from the ASF dual-hosted git repository.
albumenj pushed a commit to branch 3.2
in repository https://gitbox.apache.org/repos/asf/dubbo.git
The following commit(s) were added to refs/heads/3.2 by this push:
new 48bc7165f7 fix reference bean name conflicts (#11699)
48bc7165f7 is described below
commit 48bc7165f7d81535db35ca8f4eee871261dfb034
Author: liufeiyu1002 <[email protected]>
AuthorDate: Fri Mar 3 07:15:26 2023 +0800
fix reference bean name conflicts (#11699)
* fix reference bean name conflicts
* add ut case
---
.../ReferenceAnnotationBeanPostProcessor.java | 19 ++++++++++++--
.../ReferenceAnnotationBeanPostProcessorTest.java | 29 +++++++++++++++++-----
2 files changed, 40 insertions(+), 8 deletions(-)
diff --git
a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessor.java
b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessor.java
index adee70d4cf..bc6ddabfbb 100644
---
a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessor.java
+++
b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessor.java
@@ -19,6 +19,7 @@ package
org.apache.dubbo.config.spring.beans.factory.annotation;
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.common.utils.ArrayUtils;
import org.apache.dubbo.common.utils.Assert;
import org.apache.dubbo.common.utils.ClassUtils;
import org.apache.dubbo.common.utils.StringUtils;
@@ -413,8 +414,22 @@ public class ReferenceAnnotationBeanPostProcessor extends
AbstractAnnotationBean
}
//check bean definition
- if (beanDefinitionRegistry.containsBeanDefinition(referenceBeanName)) {
- BeanDefinition prevBeanDefinition =
beanDefinitionRegistry.getBeanDefinition(referenceBeanName);
+ boolean isContains;
+ if ((isContains =
beanDefinitionRegistry.containsBeanDefinition(referenceBeanName)) ||
beanDefinitionRegistry.isAlias(referenceBeanName)) {
+ String preReferenceBeanName = referenceBeanName;
+ if (!isContains){
+ // Look in the alias for the origin bean name
+ String[] aliases =
beanDefinitionRegistry.getAliases(referenceBeanName);
+ if (ArrayUtils.isNotEmpty(aliases)) {
+ for (String alias : aliases) {
+ if
(beanDefinitionRegistry.containsBeanDefinition(alias)) {
+ preReferenceBeanName = alias;
+ break;
+ }
+ }
+ }
+ }
+ BeanDefinition prevBeanDefinition =
beanDefinitionRegistry.getBeanDefinition(preReferenceBeanName);
String prevBeanType = prevBeanDefinition.getBeanClassName();
String prevBeanDesc = referenceBeanName + "[" + prevBeanType + "]";
String newBeanDesc = referenceBeanName + "[" + referenceKey + "]";
diff --git
a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessorTest.java
b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessorTest.java
index 06d0592668..a4fbcff02d 100644
---
a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessorTest.java
+++
b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessorTest.java
@@ -128,15 +128,30 @@ class ReferenceAnnotationBeanPostProcessorTest {
@DubboReference(version = "2", url = "dubbo://127.0.0.1:12345?version=2",
tag = "demo_tag")
private HelloService helloService2;
- // #7 ReferenceBean (Method Injection #3)
+ // #7 ReferenceBean (Field Injection #5)
+ // The HelloService is the same as above service(#6 ReferenceBean (Field
Injection #4)), helloService3 will be registered as an alias of helloService2
+ @DubboReference(version = "2", url = "dubbo://127.0.0.1:12345?version=2",
tag = "demo_tag")
+ private HelloService helloService3;
+
+ // #8 ReferenceBean (Method Injection #3)
@DubboReference(version = "3", url = "dubbo://127.0.0.1:12345?version=2",
tag = "demo_tag")
public void setHelloService2(HelloService helloService2) {
// The helloService2 beanName is the same as above(#6 ReferenceBean
(Field Injection #4)), and this will rename to helloService2#2
renamedHelloService2 = helloService2;
}
+ // #9 ReferenceBean (Method Injection #4)
+ @DubboReference(version = "4", url = "dubbo://127.0.0.1:12345?version=2")
+ public void setHelloService3(DemoService helloService3){
+ // The helloService3 beanName is the same as above(#7 ReferenceBean
(Field Injection #5) is an alias),
+ // The current beanName(helloService3) is not registered in the
beanDefinitionMap, but it is already an alias. so this will rename to
helloService3#2
+ this.renamedHelloService3 = helloService3;
+ }
+
private HelloService renamedHelloService2;
+ private DemoService renamedHelloService3;
+
@Test
void testAop() throws Exception {
@@ -150,7 +165,7 @@ class ReferenceAnnotationBeanPostProcessorTest {
Assertions.assertNotNull(testBean.getDemoServiceFromParent());
Assertions.assertNotNull(testBean.getDemoService());
Assertions.assertNotNull(testBean.myDemoService);
- Assertions.assertEquals(2, demoServicesMap.size());
+ Assertions.assertEquals(3, demoServicesMap.size());
Assertions.assertNotNull(context.getBean("demoServiceImpl"));
Assertions.assertNotNull(context.getBean("myDemoService"));
@@ -189,12 +204,13 @@ class ReferenceAnnotationBeanPostProcessorTest {
Map<InjectionMetadata.InjectedElement, ReferenceBean<?>>
referenceBeanMap =
beanPostProcessor.getInjectedFieldReferenceBeanMap();
- Assertions.assertEquals(4, referenceBeanMap.size());
+ Assertions.assertEquals(5, referenceBeanMap.size());
Map<String, Integer> checkingFieldNames = new HashMap<>();
checkingFieldNames.put("private
org.apache.dubbo.config.spring.api.HelloService
org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessorTest$MyConfiguration.helloService",
0);
checkingFieldNames.put("private
org.apache.dubbo.config.spring.api.HelloService
org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessorTest.helloService",
0);
checkingFieldNames.put("private
org.apache.dubbo.config.spring.api.HelloService
org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessorTest.helloService2",
0);
+ checkingFieldNames.put("private
org.apache.dubbo.config.spring.api.HelloService
org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessorTest.helloService3",
0);
checkingFieldNames.put("private
org.apache.dubbo.config.spring.api.DemoService
org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessorTest$ParentBean.demoServiceFromParent",
0);
for (Map.Entry<InjectionMetadata.InjectedElement, ReferenceBean<?>>
entry : referenceBeanMap.entrySet()) {
@@ -222,12 +238,13 @@ class ReferenceAnnotationBeanPostProcessorTest {
Map<InjectionMetadata.InjectedElement, ReferenceBean<?>>
referenceBeanMap =
beanPostProcessor.getInjectedMethodReferenceBeanMap();
- Assertions.assertEquals(3, referenceBeanMap.size());
+ Assertions.assertEquals(4, referenceBeanMap.size());
Map<String, Integer> checkingMethodNames = new HashMap<>();
checkingMethodNames.put("setDemoServiceFromAncestor", 0);
checkingMethodNames.put("setDemoService", 0);
checkingMethodNames.put("setHelloService2", 0);
+ checkingMethodNames.put("setHelloService3", 0);
for (Map.Entry<InjectionMetadata.InjectedElement, ReferenceBean<?>>
entry : referenceBeanMap.entrySet()) {
@@ -252,7 +269,7 @@ class ReferenceAnnotationBeanPostProcessorTest {
Collection<ReferenceBean> referenceBeans =
referenceBeanManager.getReferences();
- Assertions.assertEquals(4, referenceBeans.size());
+ Assertions.assertEquals(5, referenceBeans.size());
for (ReferenceBean referenceBean : referenceBeans) {
ReferenceConfig referenceConfig =
referenceBean.getReferenceConfig();
@@ -350,4 +367,4 @@ class ReferenceAnnotationBeanPostProcessorTest {
}
}
-}
\ No newline at end of file
+}