You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by li...@apache.org on 2021/02/07 02:39:28 UTC

[dubbo] branch 2.7.9-release updated: [dubbo-samples - 272] Improve getOptionalBean/getBeans (#7145)

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

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


The following commit(s) were added to refs/heads/2.7.9-release by this push:
     new 901a414  [dubbo-samples - 272] Improve getOptionalBean/getBeans (#7145)
901a414 is described below

commit 901a4144ddaa0b0d421f6501d4d2853b2c14728d
Author: gongdewei <ky...@qq.com>
AuthorDate: Sat Feb 6 20:38:53 2021 -0600

    [dubbo-samples - 272] Improve getOptionalBean/getBeans (#7145)
---
 .github/workflows/build-and-test.yml               | 44 ++++++-----
 .../AbstractAnnotationConfigBeanBuilder.java       |  9 +--
 .../AnnotatedInterfaceConfigBeanBuilder.java       |  9 +--
 .../factory/annotation/ReferenceBeanBuilder.java   |  3 +-
 .../spring/extension/SpringExtensionFactory.java   |  7 +-
 .../dubbo/config/spring/util/DubboBeanUtils.java   | 87 +++++++++++++++++++++-
 .../annotation/ReferenceBeanBuilderTest.java       |  2 +-
 7 files changed, 123 insertions(+), 38 deletions(-)

diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml
index 508c5df..67c47b4 100644
--- a/.github/workflows/build-and-test.yml
+++ b/.github/workflows/build-and-test.yml
@@ -1,6 +1,6 @@
 name: Build and Test
 
-on: [push, pull_request]
+on: [push, pull_request, workflow_dispatch]
 
 env:
   FORK_COUNT: 2
@@ -13,11 +13,22 @@ env:
     spring-boot.version:1.5.22.RELEASE;
     spring-boot.version:2.4.1;
     '
+  DUBBO_SPRING_BOOT_REF: '2.7.x'
+
 jobs:
   build-source:
     runs-on: ubuntu-18.04
+    outputs:
+      version: ${{ steps.dubbo-version.outputs.version }}
     steps:
       - uses: actions/checkout@v2
+        with:
+          path: dubbo
+      - uses: actions/checkout@v2
+        with:
+          repository: 'apache/dubbo-spring-boot-project'
+          ref: ${{env.DUBBO_SPRING_BOOT_REF}}
+          path: dubbo-spring-boot-project
       - uses: actions/setup-java@v1
         with:
           java-version: 8
@@ -31,18 +42,20 @@ jobs:
         with:
           path: ~/.m2/repository/org/apache/dubbo
           key: ${{ runner.os }}-dubbo-snapshot-${{ github.sha }}
-      - name: "Build with Maven"
-        run: ./mvnw --batch-mode -U -e --no-transfer-progress  clean install -Dmaven.wagon.httpconnectionManager.ttlSeconds=120 -Dmaven.wagon.http.retryHandler.count=5 -Dmaven.test.skip=true -Dmaven.test.skip.exec=true
+      - name: "Build Dubbo with Maven"
+        run: |
+          cd ./dubbo
+          ./mvnw --batch-mode -U -e --no-transfer-progress  clean install -Dmaven.wagon.httpconnectionManager.ttlSeconds=120 -Dmaven.wagon.http.retryHandler.count=5 -Dmaven.test.skip=true -Dmaven.test.skip.exec=true
+      - name: "Build Dubbo Spring Boot with Maven"
+        run: |
+          cd ./dubbo-spring-boot-project
+          ./mvnw --batch-mode --no-transfer-progress  clean install -Dmaven.test.skip=true -Dmaven.test.skip.exec=true
       - name: "Calculate Dubbo Version"
+        id: dubbo-version
         run: |
-          REVISION=`awk '/<revision>[^<]+<\/revision>/{gsub(/<revision>|<\/revision>/,"",$1);print $1;exit;}' pom.xml`
-          mkdir dubbo-version
-          echo $REVISION > dubbo-version/dubbo-version
-      - name: "Upload Dubbo version"
-        uses: actions/upload-artifact@v2
-        with:
-          name: dubbo-version
-          path: dubbo-version
+          REVISION=`awk '/<revision>[^<]+<\/revision>/{gsub(/<revision>|<\/revision>/,"",$1);print $1;exit;}' ./dubbo/pom.xml`
+          echo "::set-output name=version::$REVISION"
+          echo "dubbo version: $REVISION"
 
   unit-test:
     needs: [build-source]
@@ -126,25 +139,18 @@ jobs:
         with:
           path: ~/.m2/repository/org/apache/dubbo
           key: ${{ runner.os }}-dubbo-snapshot-${{ github.sha }}
-          restore-keys: |
-            ${{ runner.os }}-dubbo-
       - name: "Download test list"
         uses: actions/download-artifact@v2
         with:
           name: test-list
           path: test/jobs/
-      - name: "Download Dubbo version"
-        uses: actions/download-artifact@v2
-        with:
-          name: dubbo-version
-          path: dubbo-version
       - name: "Set up JDK 8"
         uses: actions/setup-java@v1
         with:
           java-version: 8
       - name: "Init Candidate Versions"
         run: |
-          DUBBO_VERSION=`cat dubbo-version/dubbo-version`
+          DUBBO_VERSION="${{needs.build-source.outputs.version}}"
           CANDIDATE_VERSIONS="dubbo.version:$DUBBO_VERSION;$CANDIDATE_VERSIONS"
           echo "CANDIDATE_VERSIONS=$CANDIDATE_VERSIONS" >> $GITHUB_ENV
       - name: "Build test image"
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/AbstractAnnotationConfigBeanBuilder.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/AbstractAnnotationConfigBeanBuilder.java
index 01186af..f12f0d7 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/AbstractAnnotationConfigBeanBuilder.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/AbstractAnnotationConfigBeanBuilder.java
@@ -16,22 +16,21 @@
  */
 package org.apache.dubbo.config.spring.beans.factory.annotation;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.dubbo.config.AbstractInterfaceConfig;
 import org.apache.dubbo.config.ApplicationConfig;
 import org.apache.dubbo.config.ModuleConfig;
 import org.apache.dubbo.config.MonitorConfig;
 import org.apache.dubbo.config.RegistryConfig;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.springframework.context.ApplicationContext;
 import org.springframework.util.Assert;
 
 import java.lang.annotation.Annotation;
 import java.util.List;
 
-import static com.alibaba.spring.util.BeanFactoryUtils.getBeans;
-import static com.alibaba.spring.util.BeanFactoryUtils.getOptionalBean;
+import static org.apache.dubbo.config.spring.util.DubboBeanUtils.getBeans;
+import static org.apache.dubbo.config.spring.util.DubboBeanUtils.getOptionalBean;
 
 /**
  * Abstract Configurable {@link Annotation} Bean Builder
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/AnnotatedInterfaceConfigBeanBuilder.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/AnnotatedInterfaceConfigBeanBuilder.java
index be951ae..15055f7 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/AnnotatedInterfaceConfigBeanBuilder.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/AnnotatedInterfaceConfigBeanBuilder.java
@@ -16,14 +16,13 @@
  */
 package org.apache.dubbo.config.spring.beans.factory.annotation;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.dubbo.config.AbstractInterfaceConfig;
 import org.apache.dubbo.config.ApplicationConfig;
 import org.apache.dubbo.config.ModuleConfig;
 import org.apache.dubbo.config.MonitorConfig;
 import org.apache.dubbo.config.RegistryConfig;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.springframework.context.ApplicationContext;
 import org.springframework.core.annotation.AnnotationAttributes;
 import org.springframework.util.Assert;
@@ -31,8 +30,8 @@ import org.springframework.util.Assert;
 import java.lang.annotation.Annotation;
 import java.util.List;
 
-import static com.alibaba.spring.util.BeanFactoryUtils.getBeans;
-import static com.alibaba.spring.util.BeanFactoryUtils.getOptionalBean;
+import static org.apache.dubbo.config.spring.util.DubboBeanUtils.getBeans;
+import static org.apache.dubbo.config.spring.util.DubboBeanUtils.getOptionalBean;
 
 /**
  * An Abstract Builder to build {@link AbstractInterfaceConfig Interface Config} Bean that annotated
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 f6aacf4..813becc 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
@@ -22,7 +22,6 @@ 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;
-
 import org.springframework.beans.propertyeditors.StringTrimmerEditor;
 import org.springframework.context.ApplicationContext;
 import org.springframework.core.annotation.AnnotationAttributes;
@@ -36,9 +35,9 @@ import java.util.Map;
 
 import static com.alibaba.spring.util.AnnotationUtils.getAttribute;
 import static com.alibaba.spring.util.AnnotationUtils.getAttributes;
-import static com.alibaba.spring.util.BeanFactoryUtils.getOptionalBean;
 import static com.alibaba.spring.util.ObjectUtils.of;
 import static org.apache.dubbo.config.spring.util.DubboAnnotationUtils.resolveServiceInterfaceClass;
+import static org.apache.dubbo.config.spring.util.DubboBeanUtils.getOptionalBean;
 import static org.springframework.core.annotation.AnnotationAttributes.fromMap;
 import static org.springframework.util.StringUtils.commaDelimitedListToStringArray;
 
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionFactory.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionFactory.java
index c7b6e77..6e08c62 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionFactory.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionFactory.java
@@ -21,13 +21,13 @@ import org.apache.dubbo.common.extension.SPI;
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.common.utils.ConcurrentHashSet;
-
-import com.alibaba.spring.util.BeanFactoryUtils;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ConfigurableApplicationContext;
 
 import java.util.Set;
 
+import static org.apache.dubbo.config.spring.util.DubboBeanUtils.getOptionalBean;
+
 /**
  * SpringExtensionFactory
  */
@@ -66,7 +66,7 @@ public class SpringExtensionFactory implements ExtensionFactory {
         }
 
         for (ApplicationContext context : CONTEXTS) {
-            T bean = BeanFactoryUtils.getOptionalBean(context, name, type);
+            T bean = getOptionalBean(context, name, type);
             if (bean != null) {
                 return bean;
             }
@@ -76,4 +76,5 @@ public class SpringExtensionFactory implements ExtensionFactory {
 
         return null;
     }
+
 }
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/DubboBeanUtils.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/DubboBeanUtils.java
index 4a07e0d..e6d7d9d 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/DubboBeanUtils.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/DubboBeanUtils.java
@@ -16,6 +16,8 @@
  */
 package org.apache.dubbo.config.spring.util;
 
+import org.apache.dubbo.common.logger.Logger;
+import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.config.spring.beans.factory.annotation.DubboConfigAliasPostProcessor;
 import org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor;
 import org.apache.dubbo.config.spring.beans.factory.config.DubboConfigDefaultPropertyValueBeanPostProcessor;
@@ -23,17 +25,31 @@ import org.apache.dubbo.config.spring.beans.factory.config.DubboConfigEarlyIniti
 import org.apache.dubbo.config.spring.context.DubboApplicationListenerRegistrar;
 import org.apache.dubbo.config.spring.context.DubboBootstrapApplicationListener;
 import org.apache.dubbo.config.spring.context.DubboLifecycleComponentApplicationListener;
-
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.BeanFactoryUtils;
+import org.springframework.beans.factory.BeanNotOfRequiredTypeException;
+import org.springframework.beans.factory.ListableBeanFactory;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.beans.factory.NoUniqueBeanDefinitionException;
 import org.springframework.beans.factory.support.BeanDefinitionRegistry;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
 import static com.alibaba.spring.util.BeanRegistrar.registerInfrastructureBean;
+import static java.util.Collections.emptyList;
+import static java.util.Collections.unmodifiableList;
+import static org.springframework.util.ObjectUtils.isEmpty;
 
 /**
  * Dubbo Bean utilities class
  *
  * @since 2.7.6
  */
-public interface DubboBeanUtils {
+public abstract class DubboBeanUtils {
+
+    private static final Logger logger = LoggerFactory.getLogger(DubboBeanUtils.class);
 
     /**
      * Register the common beans
@@ -45,7 +61,7 @@ public interface DubboBeanUtils {
      * @see DubboLifecycleComponentApplicationListener
      * @see DubboBootstrapApplicationListener
      */
-    static void registerCommonBeans(BeanDefinitionRegistry registry) {
+    public static void registerCommonBeans(BeanDefinitionRegistry registry) {
 
         // Since 2.5.7 Register @Reference Annotation Bean Processor as an infrastructure Bean
         registerInfrastructureBean(registry, ReferenceAnnotationBeanPostProcessor.BEAN_NAME,
@@ -77,4 +93,69 @@ public interface DubboBeanUtils {
         registerInfrastructureBean(registry, DubboConfigEarlyInitializationPostProcessor.BEAN_NAME,
                 DubboConfigEarlyInitializationPostProcessor.class);
     }
+
+    /**
+     * Get optional bean by name and type if beanName is not null, or else find by type
+     *
+     * @param beanFactory
+     * @param beanName
+     * @param beanType
+     * @param <T>
+     * @return
+     */
+    public static <T> T getOptionalBean(ListableBeanFactory beanFactory, String beanName, Class<T> beanType) throws BeansException {
+        if (beanName == null) {
+            return getOptionalBeanByType(beanFactory, beanType);
+        }
+
+        T bean = null;
+        try {
+            bean = beanFactory.getBean(beanName, beanType);
+        } catch (NoSuchBeanDefinitionException e) {
+            // ignore NoSuchBeanDefinitionException
+        } catch (BeanNotOfRequiredTypeException e) {
+            // ignore BeanNotOfRequiredTypeException
+            logger.warn(String.format("bean type not match, name: %s, expected type: %s, actual type: %s",
+                    beanName, beanType.getName(), e.getActualType().getName()));
+        }
+        return bean;
+    }
+
+    private static <T> T getOptionalBeanByType(ListableBeanFactory beanFactory, Class<T> beanType) {
+        // Issue : https://github.com/alibaba/spring-context-support/issues/20
+        String[] beanNames = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(beanFactory, beanType, true, false);
+        if (beanNames == null || beanNames.length == 0) {
+            return null;
+        } else if (beanNames.length > 1){
+            throw new NoUniqueBeanDefinitionException(beanType, Arrays.asList(beanNames));
+        }
+        return (T) beanFactory.getBean(beanNames[0]);
+    }
+
+    public static <T> T getBean(ListableBeanFactory beanFactory, String beanName, Class<T> beanType) throws BeansException {
+        return beanFactory.getBean(beanName, beanType);
+    }
+
+    /**
+     * Get beans by names and type
+     *
+     * @param beanFactory
+     * @param beanNames
+     * @param beanType
+     * @param <T>
+     * @return
+     */
+    public static <T> List<T> getBeans(ListableBeanFactory beanFactory, String[] beanNames, Class<T> beanType) throws BeansException {
+        if (isEmpty(beanNames)) {
+            return emptyList();
+        }
+        List<T> beans = new ArrayList<T>(beanNames.length);
+        for (String beanName : beanNames) {
+            T bean = getBean(beanFactory, beanName, beanType);
+            if (bean != null) {
+                beans.add(bean);
+            }
+        }
+        return unmodifiableList(beans);
+    }
 }
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceBeanBuilderTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceBeanBuilderTest.java
index da56ef9..5ad4afd 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceBeanBuilderTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceBeanBuilderTest.java
@@ -70,7 +70,7 @@ public class ReferenceBeanBuilderTest {
             timeout = 3, cache = "cache", filter = {"echo", "generic", "accesslog"},
             listener = {"deprecated"}, parameters = {"n1=v1  ", "n2 = v2 ", "  n3 =   v3  "},
             application = "application",
-            module = "module", consumer = "consumer", monitor = "monitor", registry = {"registry"},
+            module = "module", consumer = "consumer", monitor = "monitor", registry = {},
             // @since 2.7.3
             id = "reference",
             // @since 2.7.8