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

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


The following commit(s) were added to refs/heads/master by this push:
     new 08d5f15  Merge pull request #3639, Add equivalent annotation support 
for MethodConfig.
08d5f15 is described below

commit 08d5f15a4cb5ea014eb817b1b1106c8fae449998
Author: cvictory <shenglic...@gmail.com>
AuthorDate: Thu Mar 14 16:27:11 2019 +0800

    Merge pull request #3639, Add equivalent annotation support for 
MethodConfig.
    
    Fixes #2045
---
 .../org/apache/dubbo/config/ArgumentConfig.java    | 12 +++-
 .../java/org/apache/dubbo/config/MethodConfig.java | 45 +++++++++++++-
 .../org/apache/dubbo/config/ReferenceConfig.java   |  1 +
 .../org/apache/dubbo/config/ServiceConfig.java     |  1 +
 .../apache/dubbo/config/annotation/Argument.java}  | 37 +++++++-----
 .../org/apache/dubbo/config/annotation/Method.java | 69 ++++++++++++++++++++++
 .../apache/dubbo/config/annotation/Reference.java  |  6 ++
 .../apache/dubbo/config/annotation/Service.java    |  6 ++
 .../apache/dubbo/config/AbstractConfigTest.java    | 19 ++++++
 .../org/apache/dubbo/config/MethodConfigTest.java  | 54 ++++++++++++++++-
 .../apache/dubbo/config/ReferenceConfigTest.java   | 31 ++++++++++
 .../factory/annotation/ReferenceBeanBuilder.java   | 13 ++++
 .../ServiceAnnotationBeanPostProcessor.java        |  8 ++-
 .../dubbo/config/spring/util/AnnotationUtils.java  | 13 +++-
 .../annotation/consumer/AnnotationAction.java      |  5 +-
 15 files changed, 298 insertions(+), 22 deletions(-)

diff --git 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ArgumentConfig.java
 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ArgumentConfig.java
index 61db01f..74d906c 100644
--- 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ArgumentConfig.java
+++ 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ArgumentConfig.java
@@ -16,6 +16,7 @@
  */
 package org.apache.dubbo.config;
 
+import org.apache.dubbo.config.annotation.Argument;
 import org.apache.dubbo.config.support.Parameter;
 
 import java.io.Serializable;
@@ -44,6 +45,15 @@ public class ArgumentConfig implements Serializable {
      */
     private Boolean callback;
 
+    public ArgumentConfig() {
+    }
+
+    public ArgumentConfig(Argument argument) {
+        this.index = argument.index();
+        this.type = argument.type();
+        this.callback = argument.callback();
+    }
+
     @Parameter(excluded = true)
     public Integer getIndex() {
         return index;
@@ -70,4 +80,4 @@ public class ArgumentConfig implements Serializable {
         return callback;
     }
 
-}
\ No newline at end of file
+}
diff --git 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/MethodConfig.java
 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/MethodConfig.java
index d65c665..c9478d4 100644
--- 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/MethodConfig.java
+++ 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/MethodConfig.java
@@ -18,8 +18,11 @@ package org.apache.dubbo.config;
 
 import org.apache.dubbo.common.Constants;
 import org.apache.dubbo.common.utils.StringUtils;
+import org.apache.dubbo.config.annotation.Method;
 import org.apache.dubbo.config.support.Parameter;
 
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -117,6 +120,46 @@ public class MethodConfig extends AbstractMethodConfig {
         return name;
     }
 
+    public MethodConfig() {
+    }
+
+    public MethodConfig(Method method) {
+        appendAnnotation(Method.class, method);
+
+        this.setReturn(method.isReturn());
+
+        if(!"".equals(method.oninvoke())){
+            this.setOninvoke(method.oninvoke());
+        }
+        if(!"".equals(method.onreturn())){
+            this.setOnreturn(method.onreturn());
+        }
+        if(!"".equals(method.onthrow())){
+            this.setOnthrow(method.onthrow());
+        }
+
+        if (method.arguments() != null && method.arguments().length != 0) {
+            List<ArgumentConfig> argumentConfigs = new 
ArrayList<ArgumentConfig>(method.arguments().length);
+            this.setArguments(argumentConfigs);
+            for (int i = 0; i < method.arguments().length; i++) {
+                ArgumentConfig argumentConfig = new 
ArgumentConfig(method.arguments()[i]);
+                argumentConfigs.add(argumentConfig);
+            }
+        }
+    }
+
+    public static List<MethodConfig> constructMethodConfig(Method[] methods) {
+        if (methods != null && methods.length != 0) {
+            List<MethodConfig> methodConfigs = new 
ArrayList<MethodConfig>(methods.length);
+            for (int i = 0; i < methods.length; i++) {
+                MethodConfig methodConfig = new MethodConfig(methods[i]);
+                methodConfigs.add(methodConfig);
+            }
+            return methodConfigs;
+        }
+        return Collections.emptyList();
+    }
+
     public void setName(String name) {
         checkMethodName("name", name);
         this.name = name;
@@ -279,4 +322,4 @@ public class MethodConfig extends AbstractMethodConfig {
                 + (StringUtils.isEmpty(serviceId) ? "" : ("." + serviceId))
                 + "." + getName();
     }
-}
\ No newline at end of file
+}
diff --git 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
index a7bbf13..b2d5fcd 100644
--- 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
+++ 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
@@ -178,6 +178,7 @@ public class ReferenceConfig<T> extends 
AbstractReferenceConfig {
 
     public ReferenceConfig(Reference reference) {
         appendAnnotation(Reference.class, reference);
+        setMethods(MethodConfig.constructMethodConfig(reference.methods()));
     }
 
     public URL toUrl() {
diff --git 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
index 7cca8cc..2c640ca 100644
--- 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
+++ 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
@@ -169,6 +169,7 @@ public class ServiceConfig<T> extends AbstractServiceConfig 
{
 
     public ServiceConfig(Service service) {
         appendAnnotation(Service.class, service);
+        setMethods(MethodConfig.constructMethodConfig(service.methods()));
     }
 
     @Deprecated
diff --git 
a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/annotation/consumer/AnnotationAction.java
 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/annotation/Argument.java
similarity index 56%
copy from 
dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/annotation/consumer/AnnotationAction.java
copy to 
dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/annotation/Argument.java
index 35d94fe..6a0da8e 100644
--- 
a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/annotation/consumer/AnnotationAction.java
+++ 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/annotation/Argument.java
@@ -14,24 +14,31 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.config.spring.annotation.consumer;
+package org.apache.dubbo.config.annotation;
 
-import org.apache.dubbo.config.annotation.Reference;
-import org.apache.dubbo.config.spring.api.DemoService;
-
-import org.springframework.stereotype.Controller;
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
 
 /**
- * AnnotationAction
+ * @since 2.6.5
+ *
+ * 2018/9/29
  */
-@Controller("annotationAction")
-public class AnnotationAction {
-
-    @Reference(version = "1.2")
-    private DemoService demoService;
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.ANNOTATION_TYPE})
+@Inherited
+public @interface Argument {
+    //argument: index -1 represents not set
+    int index() default -1;
 
-    public String doSayName(String name) {
-        return demoService.sayName(name);
-    }
+    //argument type
+    String type() default "";
 
-}
\ No newline at end of file
+    //callback interface
+    boolean callback() default false;
+}
diff --git 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/annotation/Method.java
 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/annotation/Method.java
new file mode 100644
index 0000000..0cdc97c
--- /dev/null
+++ 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/annotation/Method.java
@@ -0,0 +1,69 @@
+/*
+ * 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.annotation;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @since 2.6.5
+ *  *
+ *  * 2018/9/29
+ */
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.ANNOTATION_TYPE})
+@Inherited
+public @interface Method {
+    String name();
+
+    int timeout() default -1;
+
+    int retries() default -1;
+
+    String loadbalance() default "";
+
+    boolean async() default false;
+
+    boolean sent() default true;
+
+    int actives() default 0;
+
+    int executes() default 0;
+
+    boolean deprecated() default false;
+
+    boolean sticky() default false;
+
+    boolean isReturn() default true;
+
+    String oninvoke() default "";
+
+    String onreturn() default "";
+
+    String onthrow() default "";
+
+    String cache() default "";
+
+    String validation() default "";
+
+    Argument[] arguments() default {};
+}
diff --git 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/annotation/Reference.java
 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/annotation/Reference.java
index 9aaea67..bdbbd35 100644
--- 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/annotation/Reference.java
+++ 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/annotation/Reference.java
@@ -256,4 +256,10 @@ public @interface Reference {
      * Protocol spring bean names
      */
     String protocol() default "";
+
+    /**
+     * methods support
+     * @return
+     */
+    Method[] methods() default {};
 }
diff --git 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/annotation/Service.java
 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/annotation/Service.java
index 6f956f5..2e6f9b6 100644
--- 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/annotation/Service.java
+++ 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/annotation/Service.java
@@ -268,4 +268,10 @@ public @interface Service {
      * Service tag name
      */
     String tag() default "";
+
+    /**
+     * methods support
+     * @return
+     */
+    Method[] methods() default {};
 }
diff --git 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java
 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java
index d95b2de..2d40cc3 100644
--- 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java
+++ 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java
@@ -468,6 +468,12 @@ public class AbstractConfigTest {
     }
 
     @Retention(RetentionPolicy.RUNTIME)
+    @Target({ElementType.ANNOTATION_TYPE})
+    public @interface ConfigField {
+        String value() default "";
+    }
+
+    @Retention(RetentionPolicy.RUNTIME)
     @Target({ElementType.FIELD, ElementType.METHOD, 
ElementType.ANNOTATION_TYPE})
     public @interface Config {
         Class<?> interfaceClass() default void.class;
@@ -479,6 +485,10 @@ public class AbstractConfigTest {
         String[] listener() default {};
 
         String[] parameters() default {};
+
+        ConfigField[] configFields() default {};
+
+        ConfigField configField() default @ConfigField;
     }
 
     private static class OverrideConfig extends AbstractInterfaceConfig {
@@ -735,6 +745,7 @@ public class AbstractConfigTest {
         private String filter;
         private String listener;
         private Map<String, String> parameters;
+        private String[] configFields;
 
         public Class getInterface() {
             return interfaceClass;
@@ -767,5 +778,13 @@ public class AbstractConfigTest {
         public void setParameters(Map<String, String> parameters) {
             this.parameters = parameters;
         }
+
+        public String[] getConfigFields() {
+            return configFields;
+        }
+
+        public void setConfigFields(String[] configFields) {
+            this.configFields = configFields;
+        }
     }
 }
diff --git 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/MethodConfigTest.java
 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/MethodConfigTest.java
index 862c999..1d976d7 100644
--- 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/MethodConfigTest.java
+++ 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/MethodConfigTest.java
@@ -18,23 +18,75 @@
 package org.apache.dubbo.config;
 
 import org.apache.dubbo.common.Constants;
+import org.apache.dubbo.config.annotation.Argument;
+import org.apache.dubbo.config.annotation.Method;
+import org.apache.dubbo.config.annotation.Reference;
 
 import org.hamcrest.Matchers;
 import org.junit.jupiter.api.Test;
 
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.contains;
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.hasEntry;
 import static org.hamcrest.Matchers.hasKey;
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.not;
-import static org.hamcrest.MatcherAssert.assertThat;
 
 public class MethodConfigTest {
+    private static final String METHOD_NAME = "sayHello";
+    private static final int TIMEOUT = 1300;
+    private static final int RETRIES = 4;
+    private static final String LOADBALANCE = "random";
+    private static final boolean ASYNC = true;
+    private static final int ACTIVES = 3;
+    private static final int EXECUTES = 5;
+    private static final boolean DEPERECATED = true;
+    private static final boolean STICKY = true;
+    private static final String ONINVOKE = "i";
+    private static final String ONTHROW = "t";
+    private static final String ONRETURN = "r";
+    private static final String CACHE = "c";
+    private static final String VALIDATION = "v";
+    private static final int ARGUMENTS_INDEX = 24;
+    private static final boolean ARGUMENTS_CALLBACK = true;
+    private static final String ARGUMENTS_TYPE = "sss";
+
+    @Reference(methods = {@Method(name = METHOD_NAME, timeout = TIMEOUT, 
retries = RETRIES, loadbalance = LOADBALANCE, async = ASYNC,
+            actives = ACTIVES, executes = EXECUTES, deprecated = DEPERECATED, 
sticky = STICKY, oninvoke = ONINVOKE, onthrow = ONTHROW, onreturn = ONRETURN, 
cache = CACHE, validation = VALIDATION,
+            arguments = {@Argument(index = ARGUMENTS_INDEX, callback = 
ARGUMENTS_CALLBACK, type = ARGUMENTS_TYPE)})})
+    private String testField;
+
+    @Test
+    public void testStaticConstructor() throws NoSuchFieldException {
+        Method[] methods = 
this.getClass().getDeclaredField("testField").getAnnotation(Reference.class).methods();
+        List<MethodConfig> methodConfigs = 
MethodConfig.constructMethodConfig(methods);
+        MethodConfig methodConfig = methodConfigs.get(0);
+
+        assertThat(METHOD_NAME, equalTo(methodConfig.getName()));
+        assertThat(TIMEOUT, equalTo(methodConfig.getTimeout().intValue()));
+        assertThat(RETRIES, equalTo(methodConfig.getRetries().intValue()));
+        assertThat(LOADBALANCE, equalTo(methodConfig.getLoadbalance()));
+        assertThat(ASYNC, equalTo(methodConfig.isAsync()));
+        assertThat(ACTIVES, equalTo(methodConfig.getActives().intValue()));
+        assertThat(EXECUTES, equalTo(methodConfig.getExecutes().intValue()));
+        assertThat(DEPERECATED, equalTo(methodConfig.getDeprecated()));
+        assertThat(STICKY, equalTo(methodConfig.getSticky()));
+        assertThat(ONINVOKE, equalTo(methodConfig.getOninvoke()));
+        assertThat(ONTHROW, equalTo(methodConfig.getOnthrow()));
+        assertThat(ONRETURN, equalTo(methodConfig.getOnreturn()));
+        assertThat(CACHE, equalTo(methodConfig.getCache()));
+        assertThat(VALIDATION, equalTo(methodConfig.getValidation()));
+        assertThat(ARGUMENTS_INDEX, 
equalTo(methodConfig.getArguments().get(0).getIndex().intValue()));
+        assertThat(ARGUMENTS_CALLBACK, 
equalTo(methodConfig.getArguments().get(0).isCallback()));
+        assertThat(ARGUMENTS_TYPE, 
equalTo(methodConfig.getArguments().get(0).getType()));
+    }
+
     @Test
     public void testName() throws Exception {
         MethodConfig method = new MethodConfig();
diff --git 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
index 7c0c759..8a5cf10 100644
--- 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
+++ 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
@@ -17,6 +17,9 @@
 package org.apache.dubbo.config;
 
 import org.apache.dubbo.common.Constants;
+import org.apache.dubbo.config.annotation.Argument;
+import org.apache.dubbo.config.annotation.Method;
+import org.apache.dubbo.config.annotation.Reference;
 import org.apache.dubbo.config.api.DemoService;
 import org.apache.dubbo.config.context.ConfigManager;
 import org.apache.dubbo.config.provider.impl.DemoServiceImpl;
@@ -124,4 +127,32 @@ public class ReferenceConfigTest {
         Assertions.assertNotNull(demoService);
 
     }
+
+    @Test
+    public void testConstructWithReferenceAnnotation() throws 
NoSuchFieldException {
+        Reference reference = 
getClass().getDeclaredField("innerTest").getAnnotation(Reference.class);
+        ReferenceConfig referenceConfig = new ReferenceConfig(reference);
+        Assertions.assertTrue(referenceConfig.getMethods().size() == 1);
+        Assertions.assertEquals(((MethodConfig) 
referenceConfig.getMethods().get(0)).getName(), "sayHello");
+        Assertions.assertTrue(((MethodConfig) 
referenceConfig.getMethods().get(0)).getTimeout() == 1300);
+        Assertions.assertTrue(((MethodConfig) 
referenceConfig.getMethods().get(0)).getRetries() == 4);
+        Assertions.assertEquals(((MethodConfig) 
referenceConfig.getMethods().get(0)).getLoadbalance(), "random");
+        Assertions.assertTrue(((MethodConfig) 
referenceConfig.getMethods().get(0)).getActives() == 3);
+        Assertions.assertTrue(((MethodConfig) 
referenceConfig.getMethods().get(0)).getExecutes() == 5);
+        Assertions.assertTrue(((MethodConfig) 
referenceConfig.getMethods().get(0)).isAsync());
+        Assertions.assertEquals(((MethodConfig) 
referenceConfig.getMethods().get(0)).getOninvoke(), "i");
+        Assertions.assertEquals(((MethodConfig) 
referenceConfig.getMethods().get(0)).getOnreturn(), "r");
+        Assertions.assertEquals(((MethodConfig) 
referenceConfig.getMethods().get(0)).getOnthrow(), "t");
+        Assertions.assertEquals(((MethodConfig) 
referenceConfig.getMethods().get(0)).getCache(), "c");
+    }
+
+
+    @Reference(methods = {@Method(name = "sayHello", timeout = 1300, retries = 
4, loadbalance = "random", async = true,
+            actives = 3, executes = 5, deprecated = true, sticky = true, 
oninvoke = "i", onthrow = "t", onreturn = "r", cache = "c", validation = "v",
+            arguments = {@Argument(index = 24, callback = true, type = 
"sss")})})
+    private InnerTest innerTest;
+
+    private class InnerTest {
+
+    }
 }
diff --git 
a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceBeanBuilder.java
 
b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceBeanBuilder.java
index aff3ed2..d4aef6a 100644
--- 
a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceBeanBuilder.java
+++ 
b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceBeanBuilder.java
@@ -18,6 +18,8 @@ package 
org.apache.dubbo.config.spring.beans.factory.annotation;
 
 import org.apache.dubbo.common.utils.CollectionUtils;
 import org.apache.dubbo.config.ConsumerConfig;
+import org.apache.dubbo.config.MethodConfig;
+import org.apache.dubbo.config.annotation.Method;
 import org.apache.dubbo.config.annotation.Reference;
 import org.apache.dubbo.config.spring.ReferenceBean;
 
@@ -29,6 +31,7 @@ import org.springframework.util.StringUtils;
 import org.springframework.validation.DataBinder;
 
 import java.beans.PropertyEditorSupport;
+import java.util.List;
 import java.util.Map;
 
 import static 
org.apache.dubbo.config.spring.util.BeanFactoryUtils.getOptionalBean;
@@ -89,6 +92,14 @@ class ReferenceBeanBuilder extends 
AbstractAnnotationConfigBeanBuilder<Reference
 
     }
 
+    void configureMethodConfig(Reference reference, ReferenceBean<?> 
referenceBean){
+        Method[] methods = reference.methods();
+        List<MethodConfig> methodConfigs = 
MethodConfig.constructMethodConfig(methods);
+        if(!methodConfigs.isEmpty()){
+            referenceBean.setMethods(methodConfigs);
+        }
+    }
+
     @Override
     protected ReferenceBean doBuild() {
         return new ReferenceBean<Object>();
@@ -154,6 +165,8 @@ class ReferenceBeanBuilder extends 
AbstractAnnotationConfigBeanBuilder<Reference
 
         configureConsumerConfig(annotation, bean);
 
+        configureMethodConfig(annotation, bean);
+
         bean.afterPropertiesSet();
 
     }
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 bc5339b..22fa704 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
@@ -18,6 +18,7 @@ package 
org.apache.dubbo.config.spring.beans.factory.annotation;
 
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.config.MethodConfig;
 import org.apache.dubbo.config.annotation.Service;
 import org.apache.dubbo.config.spring.ServiceBean;
 import 
org.apache.dubbo.config.spring.context.annotation.DubboClassPathBeanDefinitionScanner;
@@ -434,6 +435,11 @@ public class ServiceAnnotationBeanPostProcessor implements 
BeanDefinitionRegistr
             builder.addPropertyValue("protocols", 
protocolRuntimeBeanReferences);
         }
 
+        List<MethodConfig> methodConfigs = 
MethodConfig.constructMethodConfig(service.methods());
+        if (!methodConfigs.isEmpty()) {
+            builder.addPropertyValue("methods", methodConfigs);
+        }
+
         return builder.getBeanDefinition();
 
     }
@@ -484,4 +490,4 @@ public class ServiceAnnotationBeanPostProcessor implements 
BeanDefinitionRegistr
         this.classLoader = classLoader;
     }
 
-}
\ No newline at end of file
+}
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 ed2a607..9832e10 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
@@ -258,6 +258,17 @@ public class AnnotationUtils {
                 continue;
             }
 
+            /**
+             * @since 2.7.1
+             * ignore annotation member
+             */
+            if (attributeValue.getClass().isAnnotation()){
+                continue;
+            }
+            if (attributeValue.getClass().isArray() && 
attributeValue.getClass().getComponentType().isAnnotation()){
+                continue;
+            }
+
             if (attributeValue instanceof String) {
                 attributeValue = resolvePlaceholders(valueOf(attributeValue), 
propertyResolver);
             } else if (attributeValue instanceof String[]) {
@@ -281,4 +292,4 @@ public class AnnotationUtils {
         return resolvedValue;
     }
 
-}
\ No newline at end of file
+}
diff --git 
a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/annotation/consumer/AnnotationAction.java
 
b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/annotation/consumer/AnnotationAction.java
index 35d94fe..1e71f01 100644
--- 
a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/annotation/consumer/AnnotationAction.java
+++ 
b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/annotation/consumer/AnnotationAction.java
@@ -16,6 +16,7 @@
  */
 package org.apache.dubbo.config.spring.annotation.consumer;
 
+import org.apache.dubbo.config.annotation.Method;
 import org.apache.dubbo.config.annotation.Reference;
 import org.apache.dubbo.config.spring.api.DemoService;
 
@@ -27,11 +28,11 @@ import org.springframework.stereotype.Controller;
 @Controller("annotationAction")
 public class AnnotationAction {
 
-    @Reference(version = "1.2")
+    @Reference(version = "1.2", methods = {@Method(name = "sayHello", timeout 
= 5000)})
     private DemoService demoService;
 
     public String doSayName(String name) {
         return demoService.sayName(name);
     }
 
-}
\ No newline at end of file
+}

Reply via email to