diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/AnnotationInjectedBeanPostProcessor.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/AnnotationInjectedBeanPostProcessor.java index aed3a5aff70..e320e06bc35 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/AnnotationInjectedBeanPostProcessor.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/AnnotationInjectedBeanPostProcessor.java @@ -61,7 +61,6 @@ import static org.apache.dubbo.config.spring.util.AnnotationUtils.getMergedAttributes; import static org.springframework.core.BridgeMethodResolver.findBridgedMethod; import static org.springframework.core.BridgeMethodResolver.isVisibilityBridgeMethodPair; -import static org.springframework.util.CollectionUtils.isEmpty; /** * Abstract generic {@link BeanPostProcessor} implementation for customized annotation that annotated injected-object. @@ -172,7 +171,7 @@ private List findFiel AnnotationAttributes attributes = getMergedAttributes(field, annotationType, getEnvironment(), true); - if (!isEmpty(attributes)) { + if (attributes != null) { if (Modifier.isStatic(field.getModifiers())) { if (logger.isWarnEnabled()) { @@ -213,7 +212,7 @@ private List findAnn AnnotationAttributes attributes = getMergedAttributes(bridgedMethod, annotationType, getEnvironment(), true); - if (!isEmpty(attributes) && method.equals(ClassUtils.getMostSpecificMethod(method, beanClass))) { + if (attributes != null && method.equals(ClassUtils.getMostSpecificMethod(method, beanClass))) { if (Modifier.isStatic(method.getModifiers())) { if (logger.isWarnEnabled()) { logger.warn("@" + annotationType.getName() + " annotation is not supported on static methods: " + method); diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/AnnotationUtils.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/AnnotationUtils.java index 3b308d30e70..19ced2b3065 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/AnnotationUtils.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/AnnotationUtils.java @@ -415,7 +415,7 @@ public static Map resolvePlaceholders(Map source * @param propertyResolver {@link PropertyResolver} instance, e.g {@link Environment} * @param ignoreDefaultValue whether ignore default value or not * @param ignoreAttributeNames the attribute names of annotation should be ignored - * @return non-null + * @return If the specified annotation type is not found, return null * @since 2.7.3 */ public static AnnotationAttributes getMergedAttributes(AnnotatedElement annotatedElement, @@ -424,7 +424,7 @@ public static AnnotationAttributes getMergedAttributes(AnnotatedElement annotate boolean ignoreDefaultValue, String... ignoreAttributeNames) { Annotation annotation = getMergedAnnotation(annotatedElement, annotationType); - return fromMap(getAttributes(annotation, propertyResolver, ignoreDefaultValue, ignoreAttributeNames)); + return annotation == null ? null : fromMap(getAttributes(annotation, propertyResolver, ignoreDefaultValue, ignoreAttributeNames)); } 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 5e904a62215..b5f5ef01f04 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 @@ -19,12 +19,14 @@ import org.apache.dubbo.config.annotation.Reference; import org.apache.dubbo.config.spring.ReferenceBean; import org.apache.dubbo.config.spring.api.DemoService; +import org.apache.dubbo.config.spring.api.HelloService; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.InjectionMetadata; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.ApplicationContext; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; @@ -36,6 +38,7 @@ import java.util.Map; import static org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor.BEAN_NAME; +import static org.junit.Assert.assertTrue; /** * {@link ReferenceAnnotationBeanPostProcessor} Test @@ -68,14 +71,31 @@ public ReferenceAnnotationBeanPostProcessor referenceAnnotationBeanPostProcessor @Autowired private ConfigurableApplicationContext context; + @Autowired + @Qualifier("defaultHelloService") + private HelloService defaultHelloService; + + @Autowired + @Qualifier("helloServiceImpl") + private HelloService helloServiceImpl; + + @Reference(id = "helloService") + private HelloService helloService; + @Test public void test() throws Exception { + assertTrue(context.containsBean("helloService")); + TestBean testBean = context.getBean(TestBean.class); DemoService demoService = testBean.getDemoService(); Assert.assertEquals("Hello,Mercy", demoService.sayName("Mercy")); + Assert.assertEquals("Greeting, Mercy", defaultHelloService.sayHello("Mercy")); + Assert.assertEquals("Hello, Mercy", helloServiceImpl.sayHello("Mercy")); + + Assert.assertEquals("Greeting, Mercy", helloService.sayHello("Mercy")); Assert.assertNotNull(testBean.getDemoServiceFromAncestor()); Assert.assertNotNull(testBean.getDemoServiceFromParent()); @@ -115,7 +135,7 @@ public void testGetReferenceBeans() { Collection> referenceBeans = beanPostProcessor.getReferenceBeans(); - Assert.assertEquals(1, referenceBeans.size()); + Assert.assertEquals(2, referenceBeans.size()); ReferenceBean referenceBean = referenceBeans.iterator().next(); @@ -135,7 +155,7 @@ public void testGetInjectedFieldReferenceBeanMap() { Map> referenceBeanMap = beanPostProcessor.getInjectedFieldReferenceBeanMap(); - Assert.assertEquals(1, referenceBeanMap.size()); + Assert.assertEquals(2, referenceBeanMap.size()); for (Map.Entry> entry : referenceBeanMap.entrySet()) { @@ -144,11 +164,6 @@ public void testGetInjectedFieldReferenceBeanMap() { Assert.assertEquals("org.apache.dubbo.config.spring.beans.factory.annotation.AnnotationInjectedBeanPostProcessor$AnnotatedFieldElement", injectedElement.getClass().getName()); - ReferenceBean referenceBean = entry.getValue(); - - Assert.assertEquals("2.5.7", referenceBean.getVersion()); - Assert.assertEquals("dubbo://127.0.0.1:12345", referenceBean.getUrl()); - } } @@ -172,11 +187,6 @@ public void testGetInjectedMethodReferenceBeanMap() { Assert.assertEquals("org.apache.dubbo.config.spring.beans.factory.annotation.AnnotationInjectedBeanPostProcessor$AnnotatedMethodElement", injectedElement.getClass().getName()); - ReferenceBean referenceBean = entry.getValue(); - - Assert.assertEquals("2.5.7", referenceBean.getVersion()); - Assert.assertEquals("dubbo://127.0.0.1:12345", referenceBean.getUrl()); - } }