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