From 0a9930c8c244305aabb1c8adc24285aefc5111ab Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Wed, 17 Apr 2019 12:51:27 +0800 Subject: [PATCH] Polish spring-cloud-incubator/spring-cloud-alibaba#559 : Resolve BeanCurrentlyInCreationException issue --- .../DubboMetadataAutoConfiguration.java | 4 ++-- .../service/DubboMetadataServiceExporter.java | 5 +++-- .../IntrospectiveDubboMetadataService.java | 15 ++++++++++----- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboMetadataAutoConfiguration.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboMetadataAutoConfiguration.java index a4b10785..b41553d5 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboMetadataAutoConfiguration.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboMetadataAutoConfiguration.java @@ -56,7 +56,7 @@ import java.util.function.Supplier; public class DubboMetadataAutoConfiguration { @Autowired - private DubboServiceMetadataRepository dubboServiceMetadataRepository; + private ObjectProvider dubboServiceMetadataRepository; @Autowired private MetadataResolver metadataResolver; @@ -100,7 +100,7 @@ public class DubboMetadataAutoConfiguration { } private void publishServiceRestMetadata(ServiceBean serviceBean) { - dubboServiceMetadataRepository.publishServiceRestMetadata(metadataResolver.resolveServiceRestMetadata(serviceBean)); + dubboServiceMetadataRepository.getIfAvailable().publishServiceRestMetadata(metadataResolver.resolveServiceRestMetadata(serviceBean)); } private void unExportDubboMetadataConfigService() { diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/service/DubboMetadataServiceExporter.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/service/DubboMetadataServiceExporter.java index 5f1d48af..598b1ac3 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/service/DubboMetadataServiceExporter.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/service/DubboMetadataServiceExporter.java @@ -23,6 +23,7 @@ import org.apache.dubbo.config.ServiceConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @@ -45,7 +46,7 @@ public class DubboMetadataServiceExporter { private ApplicationConfig applicationConfig; @Autowired - private DubboMetadataService dubboMetadataService; + private ObjectProvider dubboMetadataService; @Autowired private Supplier protocolConfigSupplier; @@ -74,7 +75,7 @@ public class DubboMetadataServiceExporter { serviceConfig.setVersion(DubboMetadataService.VERSION); // Use current Spring application name as the Dubbo Service group serviceConfig.setGroup(currentApplicationName); - serviceConfig.setRef(dubboMetadataService); + serviceConfig.setRef(dubboMetadataService.getIfAvailable()); serviceConfig.setApplication(applicationConfig); serviceConfig.setProtocol(protocolConfigSupplier.get()); diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/service/IntrospectiveDubboMetadataService.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/service/IntrospectiveDubboMetadataService.java index b409db98..048f4e2e 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/service/IntrospectiveDubboMetadataService.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/service/IntrospectiveDubboMetadataService.java @@ -20,6 +20,7 @@ import org.apache.dubbo.common.URL; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.alibaba.dubbo.metadata.ServiceRestMetadata; import org.springframework.cloud.alibaba.dubbo.metadata.repository.DubboServiceMetadataRepository; @@ -44,14 +45,14 @@ public class IntrospectiveDubboMetadataService implements DubboMetadataService { private final Logger logger = LoggerFactory.getLogger(getClass()); @Autowired - private DubboServiceMetadataRepository dubboServiceMetadataRepository; + private ObjectProvider dubboServiceMetadataRepository; @Autowired private JSONUtils jsonUtils; @Override public String getServiceRestMetadata() { - Set serviceRestMetadata = dubboServiceMetadataRepository.getServiceRestMetadata(); + Set serviceRestMetadata = getRepository().getServiceRestMetadata(); String serviceRestMetadataJsonConfig = null; if (!isEmpty(serviceRestMetadata)) { serviceRestMetadataJsonConfig = jsonUtils.toJSON(serviceRestMetadata); @@ -61,12 +62,12 @@ public class IntrospectiveDubboMetadataService implements DubboMetadataService { @Override public Set getAllServiceKeys() { - return dubboServiceMetadataRepository.getAllServiceKeys(); + return getRepository().getAllServiceKeys(); } @Override public Map getAllExportedURLs() { - Map> allExportedUrls = dubboServiceMetadataRepository.getAllExportedUrls(); + Map> allExportedUrls = getRepository().getAllExportedUrls(); if (isEmpty(allExportedUrls)) { if (logger.isDebugEnabled()) { logger.debug("There is no registered URL."); @@ -85,7 +86,11 @@ public class IntrospectiveDubboMetadataService implements DubboMetadataService { @Override public String getExportedURLs(String serviceInterface, String group, String version) { - List urls = dubboServiceMetadataRepository.getExportedURLs(serviceInterface, group, version); + List urls = getRepository().getExportedURLs(serviceInterface, group, version); return jsonUtils.toJSON(urls); } + + private DubboServiceMetadataRepository getRepository() { + return dubboServiceMetadataRepository.getIfAvailable(); + } }