This is an automated email from the ASF dual-hosted git repository.

mercyblitz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/master by this push:
     new 1a9ddd8  allow @Service and @Reference to merge attributes form 
annotations in lower levels of the annotation hierachy. (#4078)
1a9ddd8 is described below

commit 1a9ddd866658f6ccae056e14face4152551de17e
Author: wenchao wang <dhcha...@aliyun.com>
AuthorDate: Thu Jun 27 01:53:02 2019 -0500

    allow @Service and @Reference to merge attributes form annotations in lower 
levels of the annotation hierachy. (#4078)
    
    * allow @Service and @Reference to merge attributes form annotations in 
lower levels of the annotation hierachy.
    
    * remove author information & not introduce all dependencies for test
---
 ...atibleReferenceAnnotationBeanPostProcessor.java |  8 +--
 ...mpatibleServiceAnnotationBeanPostProcessor.java |  4 +-
 .../AnnotationInjectedBeanPostProcessor.java       |  8 +--
 .../ServiceAnnotationBeanPostProcessor.java        |  4 +-
 .../spring/annotation/merged/MergedReference.java  | 40 ++++++++++++
 .../spring/annotation/merged/MergedService.java    | 40 ++++++++++++
 .../factory/annotation/MergedAnnotationTest.java   | 74 ++++++++++++++++++++++
 7 files changed, 166 insertions(+), 12 deletions(-)

diff --git 
a/dubbo-compatible/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/CompatibleReferenceAnnotationBeanPostProcessor.java
 
b/dubbo-compatible/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/CompatibleReferenceAnnotationBeanPostProcessor.java
index d6826a5..56844be 100644
--- 
a/dubbo-compatible/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/CompatibleReferenceAnnotationBeanPostProcessor.java
+++ 
b/dubbo-compatible/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/CompatibleReferenceAnnotationBeanPostProcessor.java
@@ -55,8 +55,8 @@ import java.util.concurrent.ConcurrentMap;
 
 import static org.springframework.core.BridgeMethodResolver.findBridgedMethod;
 import static 
org.springframework.core.BridgeMethodResolver.isVisibilityBridgeMethodPair;
-import static 
org.springframework.core.annotation.AnnotationUtils.findAnnotation;
-import static 
org.springframework.core.annotation.AnnotationUtils.getAnnotation;
+import static 
org.springframework.core.annotation.AnnotatedElementUtils.findMergedAnnotation;
+import static 
org.springframework.core.annotation.AnnotatedElementUtils.getMergedAnnotation;
 
 /**
  * {@link org.springframework.beans.factory.config.BeanPostProcessor} 
implementation
@@ -116,7 +116,7 @@ public class CompatibleReferenceAnnotationBeanPostProcessor 
extends Instantiatio
             @Override
             public void doWith(Field field) throws IllegalArgumentException, 
IllegalAccessException {
 
-                Reference reference = getAnnotation(field, Reference.class);
+                Reference reference = getMergedAnnotation(field, 
Reference.class);
 
                 if (reference != null) {
 
@@ -157,7 +157,7 @@ public class CompatibleReferenceAnnotationBeanPostProcessor 
extends Instantiatio
                     return;
                 }
 
-                Reference reference = findAnnotation(bridgedMethod, 
Reference.class);
+                Reference reference = findMergedAnnotation(bridgedMethod, 
Reference.class);
 
                 if (reference != null && 
method.equals(ClassUtils.getMostSpecificMethod(method, beanClass))) {
                     if (Modifier.isStatic(method.getModifiers())) {
diff --git 
a/dubbo-compatible/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/CompatibleServiceAnnotationBeanPostProcessor.java
 
b/dubbo-compatible/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/CompatibleServiceAnnotationBeanPostProcessor.java
index 3d0370c..470352f 100644
--- 
a/dubbo-compatible/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/CompatibleServiceAnnotationBeanPostProcessor.java
+++ 
b/dubbo-compatible/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/CompatibleServiceAnnotationBeanPostProcessor.java
@@ -63,7 +63,7 @@ import java.util.Set;
 import static org.apache.dubbo.config.spring.util.ObjectUtils.of;
 import static 
org.springframework.beans.factory.support.BeanDefinitionBuilder.rootBeanDefinition;
 import static 
org.springframework.context.annotation.AnnotationConfigUtils.CONFIGURATION_BEAN_NAME_GENERATOR;
-import static 
org.springframework.core.annotation.AnnotationUtils.findAnnotation;
+import static 
org.springframework.core.annotation.AnnotatedElementUtils.findMergedAnnotation;
 import static org.springframework.util.ClassUtils.resolveClassName;
 
 /**
@@ -251,7 +251,7 @@ public class CompatibleServiceAnnotationBeanPostProcessor 
implements BeanDefinit
 
         Class<?> beanClass = resolveClass(beanDefinitionHolder);
 
-        Service service = findAnnotation(beanClass, Service.class);
+        Service service = findMergedAnnotation(beanClass, Service.class);
 
         Class<?> interfaceClass = resolveServiceInterfaceClass(beanClass, 
service);
 
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 53ff695..23f8558 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
@@ -59,8 +59,8 @@ import java.util.concurrent.ConcurrentMap;
 import static 
org.apache.dubbo.config.spring.util.ClassUtils.resolveGenericType;
 import static org.springframework.core.BridgeMethodResolver.findBridgedMethod;
 import static 
org.springframework.core.BridgeMethodResolver.isVisibilityBridgeMethodPair;
-import static 
org.springframework.core.annotation.AnnotationUtils.findAnnotation;
-import static 
org.springframework.core.annotation.AnnotationUtils.getAnnotation;
+import static 
org.springframework.core.annotation.AnnotatedElementUtils.findMergedAnnotation;
+import static 
org.springframework.core.annotation.AnnotatedElementUtils.getMergedAnnotation;
 
 /**
  * Abstract generic {@link BeanPostProcessor} implementation for customized 
annotation that annotated injected-object.
@@ -150,7 +150,7 @@ public abstract class AnnotationInjectedBeanPostProcessor<A 
extends Annotation>
 
         ReflectionUtils.doWithFields(beanClass, field -> {
 
-            A annotation = getAnnotation(field, getAnnotationType());
+            A annotation = getMergedAnnotation(field, getAnnotationType());
 
             if (annotation != null) {
 
@@ -188,7 +188,7 @@ public abstract class AnnotationInjectedBeanPostProcessor<A 
extends Annotation>
                 return;
             }
 
-            A annotation = findAnnotation(bridgedMethod, getAnnotationType());
+            A annotation = findMergedAnnotation(bridgedMethod, 
getAnnotationType());
 
             if (annotation != null && 
method.equals(ClassUtils.getMostSpecificMethod(method, beanClass))) {
                 if (Modifier.isStatic(method.getModifiers())) {
diff --git 
a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessor.java
 
b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessor.java
index 2dec2d3..8c33d86 100644
--- 
a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessor.java
+++ 
b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessor.java
@@ -64,7 +64,7 @@ import static 
org.apache.dubbo.config.spring.beans.factory.annotation.ServiceBea
 import static org.apache.dubbo.config.spring.util.ObjectUtils.of;
 import static 
org.springframework.beans.factory.support.BeanDefinitionBuilder.rootBeanDefinition;
 import static 
org.springframework.context.annotation.AnnotationConfigUtils.CONFIGURATION_BEAN_NAME_GENERATOR;
-import static 
org.springframework.core.annotation.AnnotationUtils.findAnnotation;
+import static 
org.springframework.core.annotation.AnnotatedElementUtils.findMergedAnnotation;
 import static org.springframework.util.ClassUtils.resolveClassName;
 
 /**
@@ -250,7 +250,7 @@ public class ServiceAnnotationBeanPostProcessor implements 
BeanDefinitionRegistr
 
         Class<?> beanClass = resolveClass(beanDefinitionHolder);
 
-        Service service = findAnnotation(beanClass, Service.class);
+        Service service = findMergedAnnotation(beanClass, Service.class);
 
         Class<?> interfaceClass = resolveServiceInterfaceClass(beanClass, 
service);
 
diff --git 
a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/annotation/merged/MergedReference.java
 
b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/annotation/merged/MergedReference.java
new file mode 100644
index 0000000..ddf3ac7
--- /dev/null
+++ 
b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/annotation/merged/MergedReference.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.config.spring.annotation.merged;
+
+
+import org.apache.dubbo.config.annotation.Reference;
+import org.springframework.core.annotation.AliasFor;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE})
+@Reference
+public @interface MergedReference {
+
+    @AliasFor(annotation = Reference.class, attribute = "group")
+    String group() default "dubbo";
+
+    @AliasFor(annotation = Reference.class, attribute = "version")
+    String version() default "1.0.0";
+}
diff --git 
a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/annotation/merged/MergedService.java
 
b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/annotation/merged/MergedService.java
new file mode 100644
index 0000000..1ecfbe0
--- /dev/null
+++ 
b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/annotation/merged/MergedService.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.config.spring.annotation.merged;
+
+
+import org.apache.dubbo.config.annotation.Service;
+import org.springframework.core.annotation.AliasFor;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.TYPE})
+@Service
+public @interface MergedService {
+
+    @AliasFor(annotation = Service.class, attribute = "group")
+    String group() default "dubbo";
+
+    @AliasFor(annotation = Service.class, attribute = "version")
+    String version() default "1.0.0";
+}
diff --git 
a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/MergedAnnotationTest.java
 
b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/MergedAnnotationTest.java
new file mode 100644
index 0000000..353cc3a
--- /dev/null
+++ 
b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/MergedAnnotationTest.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.config.spring.beans.factory.annotation;
+
+import org.apache.dubbo.config.annotation.Reference;
+import org.apache.dubbo.config.annotation.Service;
+import org.apache.dubbo.config.spring.annotation.merged.MergedReference;
+import org.apache.dubbo.config.spring.annotation.merged.MergedService;
+import org.apache.dubbo.config.spring.api.DemoService;
+import org.junit.Assert;
+import org.junit.Test;
+import org.springframework.core.annotation.AnnotatedElementUtils;
+import org.springframework.util.ReflectionUtils;
+import java.lang.reflect.Field;
+
+public class MergedAnnotationTest {
+
+    @Test
+    public void testMergedReference() {
+        Field field = 
ReflectionUtils.findField(MergedAnnotationTest.TestBean1.class, "demoService");
+        Reference reference = AnnotatedElementUtils.getMergedAnnotation(field, 
Reference.class);
+        Assert.assertEquals("dubbo", reference.group());
+        Assert.assertEquals("1.0.0", reference.version());
+
+        Field field2 = 
ReflectionUtils.findField(MergedAnnotationTest.TestBean2.class, "demoService");
+        Reference reference2 = 
AnnotatedElementUtils.getMergedAnnotation(field2, Reference.class);
+        Assert.assertEquals("group", reference2.group());
+        Assert.assertEquals("2.0", reference2.version());
+    }
+
+    @Test
+    public void testMergedService() {
+        Service service1 = 
AnnotatedElementUtils.getMergedAnnotation(MergedAnnotationTest.DemoServiceImpl1.class,
 Service.class);
+        Assert.assertEquals("dubbo", service1.group());
+        Assert.assertEquals("1.0.0", service1.version());
+
+        Service service2 = 
AnnotatedElementUtils.getMergedAnnotation(MergedAnnotationTest.DemoServiceImpl2.class,
 Service.class);
+        Assert.assertEquals("group", service2.group());
+        Assert.assertEquals("2.0", service2.version());
+    }
+
+    @MergedService
+    public static class DemoServiceImpl1 {
+    }
+
+    @MergedService(group = "group", version = "2.0")
+    public static class DemoServiceImpl2 {
+    }
+
+    private static class TestBean1 {
+        @MergedReference
+        private DemoService demoService;
+    }
+
+    private static class TestBean2 {
+        @MergedReference(group = "group", version = "2.0")
+        private DemoService demoService;
+    }
+
+}

Reply via email to