From 82d0ff2dafac5f1ec3a55dce5b860ec34bda7ddc Mon Sep 17 00:00:00 2001
From: mercyblitz <mercyblitz@gmail.com>
Date: Thu, 7 Mar 2019 18:31:31 +0800
Subject: [PATCH] Polish : spring-cloud-incubator/spring-cloud-alibaba#377 :
 Reactor code to be more reasonable

---
 .../DubboMetadataAutoConfiguration.java           | 15 ++++++++++++---
 ...boMetadataEventHandlingAutoConfiguration.java} | 13 ++-----------
 .../DubboOpenFeignAutoConfiguration.java          | 15 ++++-----------
 .../openfeign/TargeterBeanPostProcessor.java      |  3 +--
 .../PublishingDubboMetadataConfigService.java     |  4 ----
 .../src/main/resources/META-INF/spring.factories  |  2 +-
 6 files changed, 20 insertions(+), 32 deletions(-)
 rename spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/{DubboRestMetadataRegistrationAutoConfiguration.java => DubboMetadataEventHandlingAutoConfiguration.java} (88%)

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 eb36c5759..9464e211f 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
@@ -16,12 +16,16 @@
  */
 package org.springframework.cloud.alibaba.dubbo.autoconfigure;
 
+import feign.Contract;
 import org.apache.dubbo.config.ProtocolConfig;
-import org.apache.dubbo.config.spring.context.annotation.DubboComponentScan;
+import org.springframework.beans.factory.ObjectProvider;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.cloud.alibaba.dubbo.metadata.repository.DubboServiceMetadataRepository;
+import org.springframework.cloud.alibaba.dubbo.metadata.resolver.DubboServiceBeanMetadataResolver;
+import org.springframework.cloud.alibaba.dubbo.metadata.resolver.MetadataResolver;
 import org.springframework.cloud.alibaba.dubbo.service.DubboGenericServiceFactory;
 import org.springframework.cloud.alibaba.dubbo.service.DubboMetadataConfigServiceProxy;
+import org.springframework.cloud.alibaba.dubbo.service.PublishingDubboMetadataConfigService;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
@@ -37,12 +41,17 @@ import static com.alibaba.dubbo.common.Constants.DEFAULT_PROTOCOL;
  * @author <a href="mailto:mercyblitz@gmail.com">Mercy</a>
  */
 @Configuration
-@Import(DubboServiceMetadataRepository.class)
-@DubboComponentScan(basePackages = "org.springframework.cloud.alibaba.dubbo.service")
+@Import({DubboServiceMetadataRepository.class, PublishingDubboMetadataConfigService.class})
 public class DubboMetadataAutoConfiguration {
 
     public static final String METADATA_PROTOCOL_BEAN_NAME = "metadata";
 
+    @Bean
+    @ConditionalOnMissingBean
+    public MetadataResolver metadataJsonResolver(ObjectProvider<Contract> contract) {
+        return new DubboServiceBeanMetadataResolver(contract);
+    }
+
     /**
      * Build an alias Bean for {@link ProtocolConfig}
      *
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboRestMetadataRegistrationAutoConfiguration.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboMetadataEventHandlingAutoConfiguration.java
similarity index 88%
rename from spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboRestMetadataRegistrationAutoConfiguration.java
rename to spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboMetadataEventHandlingAutoConfiguration.java
index 242354b4d..4bfd762eb 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboRestMetadataRegistrationAutoConfiguration.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboMetadataEventHandlingAutoConfiguration.java
@@ -27,14 +27,11 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.autoconfigure.AutoConfigureAfter;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.boot.context.event.ApplicationFailedEvent;
 import org.springframework.boot.context.event.ApplicationReadyEvent;
 import org.springframework.cloud.alibaba.dubbo.metadata.resolver.MetadataResolver;
 import org.springframework.cloud.alibaba.dubbo.service.DubboMetadataConfigService;
 import org.springframework.cloud.alibaba.dubbo.service.PublishingDubboMetadataConfigService;
-import org.springframework.cloud.client.serviceregistry.Registration;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.event.ContextClosedEvent;
 import org.springframework.context.event.EventListener;
@@ -43,19 +40,13 @@ import org.springframework.util.StringUtils;
 import static org.springframework.cloud.alibaba.dubbo.autoconfigure.DubboMetadataAutoConfiguration.METADATA_PROTOCOL_BEAN_NAME;
 
 /**
- * The Auto-Configuration class for Dubbo REST metadata registration,
- * REST metadata that is a part of {@link Registration#getMetadata() Spring Cloud service instances' metadata}
- * will be registered Spring Cloud registry.
+ * The Auto-Configuration class for Dubbo metadata {@link EventListener event handling}.
  *
  * @author <a href="mailto:mercyblitz@gmail.com">Mercy</a>
  */
-@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled", matchIfMissing = true)
-@ConditionalOnBean(value = {
-        MetadataResolver.class
-})
 @AutoConfigureAfter(value = {DubboMetadataAutoConfiguration.class})
 @Configuration
-public class DubboRestMetadataRegistrationAutoConfiguration {
+public class DubboMetadataEventHandlingAutoConfiguration {
 
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboOpenFeignAutoConfiguration.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboOpenFeignAutoConfiguration.java
index 89df5ec77..2931e3b48 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboOpenFeignAutoConfiguration.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/autoconfigure/DubboOpenFeignAutoConfiguration.java
@@ -16,14 +16,9 @@
  */
 package org.springframework.cloud.alibaba.dubbo.autoconfigure;
 
-import feign.Contract;
-import org.springframework.beans.factory.ObjectProvider;
 import org.springframework.boot.autoconfigure.AutoConfigureAfter;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.cloud.alibaba.dubbo.metadata.repository.DubboServiceMetadataRepository;
-import org.springframework.cloud.alibaba.dubbo.metadata.resolver.DubboServiceBeanMetadataResolver;
-import org.springframework.cloud.alibaba.dubbo.metadata.resolver.MetadataResolver;
 import org.springframework.cloud.alibaba.dubbo.openfeign.TargeterBeanPostProcessor;
 import org.springframework.cloud.alibaba.dubbo.service.DubboGenericServiceExecutionContextFactory;
 import org.springframework.cloud.alibaba.dubbo.service.DubboGenericServiceFactory;
@@ -31,22 +26,20 @@ import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.core.env.Environment;
 
+import static org.springframework.cloud.alibaba.dubbo.autoconfigure.DubboOpenFeignAutoConfiguration.TARGETER_CLASS_NAME;
+
 
 /**
  * Dubbo Feign Auto-{@link Configuration Configuration}
  *
  * @author <a href="mailto:mercyblitz@gmail.com">Mercy</a>
  */
-@ConditionalOnClass(name = {"feign.Feign"})
+@ConditionalOnClass(name = {"feign.Feign", TARGETER_CLASS_NAME})
 @AutoConfigureAfter(name = {"org.springframework.cloud.openfeign.FeignAutoConfiguration"})
 @Configuration
 public class DubboOpenFeignAutoConfiguration {
 
-    @Bean
-    @ConditionalOnMissingBean
-    public MetadataResolver metadataJsonResolver(ObjectProvider<Contract> contract) {
-        return new DubboServiceBeanMetadataResolver(contract);
-    }
+    public static final String TARGETER_CLASS_NAME = "org.springframework.cloud.openfeign.Targeter";
 
     @Bean
     public TargeterBeanPostProcessor targeterBeanPostProcessor(Environment environment,
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/openfeign/TargeterBeanPostProcessor.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/openfeign/TargeterBeanPostProcessor.java
index a4a3c77f0..331e7a000 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/openfeign/TargeterBeanPostProcessor.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/openfeign/TargeterBeanPostProcessor.java
@@ -25,6 +25,7 @@ import org.springframework.cloud.alibaba.dubbo.service.DubboGenericServiceFactor
 import org.springframework.core.env.Environment;
 
 import static java.lang.reflect.Proxy.newProxyInstance;
+import static org.springframework.cloud.alibaba.dubbo.autoconfigure.DubboOpenFeignAutoConfiguration.TARGETER_CLASS_NAME;
 import static org.springframework.util.ClassUtils.getUserClass;
 import static org.springframework.util.ClassUtils.isPresent;
 import static org.springframework.util.ClassUtils.resolveClassName;
@@ -36,8 +37,6 @@ import static org.springframework.util.ClassUtils.resolveClassName;
  */
 public class TargeterBeanPostProcessor implements BeanPostProcessor, BeanClassLoaderAware {
 
-    private static final String TARGETER_CLASS_NAME = "org.springframework.cloud.openfeign.Targeter";
-
     private final Environment environment;
 
     private final DubboServiceMetadataRepository dubboServiceMetadataRepository;
diff --git a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/service/PublishingDubboMetadataConfigService.java b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/service/PublishingDubboMetadataConfigService.java
index 38d8ae7f0..fa49e94bb 100644
--- a/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/service/PublishingDubboMetadataConfigService.java
+++ b/spring-cloud-alibaba-dubbo/src/main/java/org/springframework/cloud/alibaba/dubbo/service/PublishingDubboMetadataConfigService.java
@@ -19,7 +19,6 @@ package org.springframework.cloud.alibaba.dubbo.service;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
-import org.apache.dubbo.config.annotation.Service;
 import org.springframework.cloud.alibaba.dubbo.metadata.ServiceRestMetadata;
 import org.springframework.util.CollectionUtils;
 
@@ -27,7 +26,6 @@ import javax.annotation.PostConstruct;
 import java.util.LinkedHashSet;
 import java.util.Set;
 
-import static org.springframework.cloud.alibaba.dubbo.autoconfigure.DubboMetadataAutoConfiguration.METADATA_PROTOCOL_BEAN_NAME;
 import static org.springframework.util.ObjectUtils.isEmpty;
 
 /**
@@ -35,8 +33,6 @@ import static org.springframework.util.ObjectUtils.isEmpty;
  *
  * @author <a href="mailto:mercyblitz@gmail.com">Mercy</a>
  */
-@Service(version = "${spring.application.name}", protocol = METADATA_PROTOCOL_BEAN_NAME)
-// Use current Spring application name as the Dubbo Service version
 public class PublishingDubboMetadataConfigService implements DubboMetadataConfigService {
 
     /**
diff --git a/spring-cloud-alibaba-dubbo/src/main/resources/META-INF/spring.factories b/spring-cloud-alibaba-dubbo/src/main/resources/META-INF/spring.factories
index 829c004ea..ed1c9c3f4 100644
--- a/spring-cloud-alibaba-dubbo/src/main/resources/META-INF/spring.factories
+++ b/spring-cloud-alibaba-dubbo/src/main/resources/META-INF/spring.factories
@@ -1,7 +1,7 @@
 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
   org.springframework.cloud.alibaba.dubbo.autoconfigure.DubboMetadataAutoConfiguration,\
   org.springframework.cloud.alibaba.dubbo.autoconfigure.DubboOpenFeignAutoConfiguration,\
-  org.springframework.cloud.alibaba.dubbo.autoconfigure.DubboRestMetadataRegistrationAutoConfiguration,\
+  org.springframework.cloud.alibaba.dubbo.autoconfigure.DubboMetadataEventHandlingAutoConfiguration,\
   org.springframework.cloud.alibaba.dubbo.autoconfigure.DubboLoadBalancedRestTemplateAutoConfiguration,\
   org.springframework.cloud.alibaba.dubbo.autoconfigure.DubboServiceAutoConfiguration