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

albumenj pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.0 by this push:
     new 5d60b34  [3.0] improve config bean initialization compatible with 
spring 3.x/4.1.x (#8407)
5d60b34 is described below

commit 5d60b34d085fbd56bafc09d295f4ee289b8c2554
Author: Gong Dewei <[email protected]>
AuthorDate: Tue Aug 3 21:57:24 2021 +0800

    [3.0] improve config bean initialization compatible with spring 3.x/4.1.x 
(#8407)
    
    * improve config bean initialization compatible with spring 3.x/4.1.x
    
    * remove unused imports
    
    * remove unused imports
---
 .../ReferenceAnnotationBeanPostProcessor.java      |  9 ++-
 .../context/DubboBootstrapApplicationListener.java | 67 +++++++++++++++-------
 .../spring/context/DubboConfigBeanInitializer.java |  8 +++
 .../DubboInfraBeanRegisterPostProcessor.java       | 12 ++--
 .../boot/autoconfigure/DubboAutoConfiguration.java | 40 +------------
 5 files changed, 67 insertions(+), 69 deletions(-)

diff --git 
a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessor.java
 
b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessor.java
index e8de74f..71591f7 100644
--- 
a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessor.java
+++ 
b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessor.java
@@ -160,8 +160,13 @@ public class ReferenceAnnotationBeanPostProcessor extends 
AbstractAnnotationBean
         // so destroy this bean here, prevent register it as BeanPostProcessor 
again, avoid cause BeanPostProcessorChecker detection error
         beanDefinitionRegistry.removeBeanDefinition(BEAN_NAME);
 
-        // this is an early event, it will be notified at 
org.springframework.context.support.AbstractApplicationContext.registerListeners()
-        applicationContext.publishEvent(new 
DubboAnnotationInitedEvent(applicationContext));
+        try {
+            // this is an early event, it will be notified at 
org.springframework.context.support.AbstractApplicationContext.registerListeners()
+            applicationContext.publishEvent(new 
DubboAnnotationInitedEvent(applicationContext));
+        } catch (Exception e) {
+            // if spring version is less then 4.2, it does not support early 
application event
+            logger.error("publish early application event failed, please 
upgrade spring version to 4.2.x or later", e);
+        }
     }
 
     /**
diff --git 
a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboBootstrapApplicationListener.java
 
b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboBootstrapApplicationListener.java
index beae589..e30892d 100644
--- 
a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboBootstrapApplicationListener.java
+++ 
b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboBootstrapApplicationListener.java
@@ -16,6 +16,8 @@
  */
 package org.apache.dubbo.config.spring.context;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.dubbo.config.DubboShutdownHook;
 import org.apache.dubbo.config.bootstrap.BootstrapTakeoverMode;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
@@ -48,6 +50,8 @@ public class DubboBootstrapApplicationListener implements 
ApplicationListener, A
      */
     public static final String BEAN_NAME = "dubboBootstrapApplicationListener";
 
+    private final Log logger = LogFactory.getLog(getClass());
+
     private final DubboBootstrap dubboBootstrap;
     private ApplicationContext applicationContext;
 
@@ -55,11 +59,6 @@ public class DubboBootstrapApplicationListener implements 
ApplicationListener, A
         this.dubboBootstrap = initBootstrap();
     }
 
-    public DubboBootstrapApplicationListener(ApplicationContext 
applicationContext) {
-        this.dubboBootstrap = initBootstrap();
-        DubboBootstrapStartStopListenerSpringAdapter.applicationContext = 
applicationContext;
-    }
-
     private DubboBootstrap initBootstrap() {
         DubboBootstrap dubboBootstrap = DubboBootstrap.getInstance();
         if (dubboBootstrap.getTakeoverMode() != BootstrapTakeoverMode.MANUAL) {
@@ -74,36 +73,26 @@ public class DubboBootstrapApplicationListener implements 
ApplicationListener, A
             if (event instanceof DubboAnnotationInitedEvent) {
                 // This event will be notified at 
AbstractApplicationContext.registerListeners(),
                 // init dubbo config beans before spring singleton beans
-                
applicationContext.getBean(DubboConfigBeanInitializer.BEAN_NAME, 
DubboConfigBeanInitializer.class);
-
-                // All infrastructure config beans are loaded, initialize 
dubbo here
-                DubboBootstrap.getInstance().initialize();
+                initDubboConfigBeans();
             } else if (event instanceof ApplicationContextEvent) {
                 this.onApplicationContextEvent((ApplicationContextEvent) 
event);
             }
         }
     }
 
-    /**
-     * Is original {@link ApplicationContext} as the event source
-     * @param event {@link ApplicationEvent}
-     * @return if original, return <code>true</code>, or <code>false</code>
-     */
-    private boolean isOriginalEventSource(ApplicationEvent event) {
+    private void initDubboConfigBeans() {
+        // load DubboConfigBeanInitializer to init config beans
+        applicationContext.getBean(DubboConfigBeanInitializer.BEAN_NAME, 
DubboConfigBeanInitializer.class);
 
-        boolean originalEventSource = nullSafeEquals(getApplicationContext(), 
event.getSource());
-//        if (!originalEventSource) {
-//            if (log.isDebugEnabled()) {
-//                log.debug("The source of event[" + event.getSource() + "] is 
not original!");
-//            }
-//        }
-        return originalEventSource;
+        // All infrastructure config beans are loaded, initialize dubbo here
+        DubboBootstrap.getInstance().initialize();
     }
 
     private void onApplicationContextEvent(ApplicationContextEvent event) {
         if (DubboBootstrapStartStopListenerSpringAdapter.applicationContext == 
null) {
             DubboBootstrapStartStopListenerSpringAdapter.applicationContext = 
event.getApplicationContext();
         }
+
         if (event instanceof ContextRefreshedEvent) {
             onContextRefreshedEvent((ContextRefreshedEvent) event);
         } else if (event instanceof ContextClosedEvent) {
@@ -124,6 +113,22 @@ public class DubboBootstrapApplicationListener implements 
ApplicationListener, A
         }
     }
 
+    /**
+     * Is original {@link ApplicationContext} as the event source
+     * @param event {@link ApplicationEvent}
+     * @return if original, return <code>true</code>, or <code>false</code>
+     */
+    private boolean isOriginalEventSource(ApplicationEvent event) {
+
+        boolean originalEventSource = nullSafeEquals(getApplicationContext(), 
event.getSource());
+//        if (!originalEventSource) {
+//            if (log.isDebugEnabled()) {
+//                log.debug("The source of event[" + event.getSource() + "] is 
not original!");
+//            }
+//        }
+        return originalEventSource;
+    }
+
     @Override
     public int getOrder() {
         return LOWEST_PRECEDENCE;
@@ -132,6 +137,24 @@ public class DubboBootstrapApplicationListener implements 
ApplicationListener, A
     @Override
     public void setApplicationContext(ApplicationContext applicationContext) 
throws BeansException {
         this.applicationContext = applicationContext;
+
+        // check call stack whether contains 
org.springframework.context.support.AbstractApplicationContext.registerListeners()
+        Exception exception = new Exception();
+        StackTraceElement[] stackTrace = exception.getStackTrace();
+        boolean found = false;
+        for (StackTraceElement frame : stackTrace) {
+            if (frame.getMethodName().equals("registerListeners") && 
frame.getClassName().endsWith("AbstractApplicationContext")) {
+                found = true;
+                break;
+            }
+        }
+        if (!found) {
+            logger.warn("DubboBootstrapApplicationListener initialization is 
unexpected, " +
+                "it should be created in 
AbstractApplicationContext.registerListeners() method", exception);
+        }
+
+        // init config beans here, compatible with spring 3.x/4.1.x
+        initDubboConfigBeans();
     }
 
     public ApplicationContext getApplicationContext() {
diff --git 
a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboConfigBeanInitializer.java
 
b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboConfigBeanInitializer.java
index a56133b..61e0f81 100644
--- 
a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboConfigBeanInitializer.java
+++ 
b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboConfigBeanInitializer.java
@@ -16,6 +16,8 @@
  */
 package org.apache.dubbo.config.spring.context;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.dubbo.config.AbstractConfig;
 import org.apache.dubbo.config.ApplicationConfig;
 import org.apache.dubbo.config.ConsumerConfig;
@@ -52,6 +54,8 @@ public class DubboConfigBeanInitializer implements 
BeanFactoryAware, Initializin
 
     public static String BEAN_NAME = "dubboConfigBeanInitializer";
 
+    private final Log logger = LogFactory.getLog(getClass());
+
     private AtomicBoolean initialized = new AtomicBoolean(false);
     private ConfigurableListableBeanFactory beanFactory;
     private ReferenceBeanManager referenceBeanManager;
@@ -84,6 +88,8 @@ public class DubboConfigBeanInitializer implements 
BeanFactoryAware, Initializin
      * Initializes there Dubbo's Config Beans before @Reference bean autowiring
      */
     private void prepareDubboConfigBeans() {
+        logger.info("loading dubbo config beans ...");
+
         //Make sure all these config beans are inited and registered to 
ConfigManager
         loadConfigBeansOfType(ApplicationConfig.class);
         loadConfigBeansOfType(ModuleConfig.class);
@@ -96,6 +102,8 @@ public class DubboConfigBeanInitializer implements 
BeanFactoryAware, Initializin
         loadConfigBeansOfType(MetadataReportConfig.class);
         loadConfigBeansOfType(MetricsConfig.class);
         loadConfigBeansOfType(SslConfig.class);
+
+        logger.info("dubbo config beans are loaded.");
     }
 
     private void loadConfigBeansOfType(Class<? extends AbstractConfig> 
configClass) {
diff --git 
a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboInfraBeanRegisterPostProcessor.java
 
b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboInfraBeanRegisterPostProcessor.java
index a16bd30..2c56100 100644
--- 
a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboInfraBeanRegisterPostProcessor.java
+++ 
b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/DubboInfraBeanRegisterPostProcessor.java
@@ -67,6 +67,12 @@ public class DubboInfraBeanRegisterPostProcessor implements 
BeanDefinitionRegist
         // register PropertySourcesPlaceholderConfigurer bean if not exits
         DubboBeanUtils.registerBeansIfNotExists(beanFactory, registry);
 
+        // Initialize dubbo Environment before ConfigManager
+        // Extract dubbo props from Spring env and put them to app config
+        ConfigurableEnvironment environment = (ConfigurableEnvironment) 
applicationContext.getEnvironment();
+        SortedMap<String, String> dubboProperties = 
EnvironmentUtils.filterDubboProperties(environment);
+        ApplicationModel.getEnvironment().setAppConfigMap(dubboProperties);
+
         // register ConfigManager singleton
         beanFactory.registerSingleton(ConfigManager.BEAN_NAME, 
ApplicationModel.getConfigManager());
     }
@@ -75,11 +81,5 @@ public class DubboInfraBeanRegisterPostProcessor implements 
BeanDefinitionRegist
     public void setApplicationContext(ApplicationContext applicationContext) 
throws BeansException {
         this.applicationContext = applicationContext;
         SpringExtensionFactory.addApplicationContext(applicationContext);
-
-        // Initialize dubbo Environment before ConfigManager
-        // Extract dubbo props from Spring env and put them to app config
-        ConfigurableEnvironment environment = (ConfigurableEnvironment) 
applicationContext.getEnvironment();
-        SortedMap<String, String> dubboProperties = 
EnvironmentUtils.filterDubboProperties(environment);
-        ApplicationModel.getEnvironment().setAppConfigMap(dubboProperties);
     }
 }
diff --git 
a/dubbo-spring-boot/dubbo-spring-boot-compatible/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/autoconfigure/DubboAutoConfiguration.java
 
b/dubbo-spring-boot/dubbo-spring-boot-compatible/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/autoconfigure/DubboAutoConfiguration.java
index 40e1299..34ce87f 100644
--- 
a/dubbo-spring-boot/dubbo-spring-boot-compatible/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/autoconfigure/DubboAutoConfiguration.java
+++ 
b/dubbo-spring-boot/dubbo-spring-boot-compatible/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/autoconfigure/DubboAutoConfiguration.java
@@ -20,21 +20,12 @@ import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.config.annotation.DubboService;
 import 
org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor;
 import 
org.apache.dubbo.config.spring.beans.factory.annotation.ServiceAnnotationPostProcessor;
-import 
org.apache.dubbo.config.spring.context.DubboBootstrapApplicationListener;
 import org.apache.dubbo.config.spring.context.annotation.EnableDubboConfig;
-
-import org.springframework.beans.BeansException;
 import org.springframework.beans.factory.annotation.Qualifier;
-import 
org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
-import org.springframework.beans.factory.support.BeanDefinitionRegistry;
-import 
org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
 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.properties.EnableConfigurationProperties;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationContextAware;
-import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
@@ -59,7 +50,7 @@ import static 
org.apache.dubbo.spring.boot.util.DubboUtils.DUBBO_SCAN_PREFIX;
 @AutoConfigureAfter(DubboRelaxedBindingAutoConfiguration.class)
 @EnableConfigurationProperties(DubboConfigurationProperties.class)
 @EnableDubboConfig
-public class DubboAutoConfiguration implements ApplicationContextAware, 
BeanDefinitionRegistryPostProcessor {
+public class DubboAutoConfiguration {
 
     /**
      * Creates {@link ServiceAnnotationPostProcessor} Bean
@@ -75,33 +66,4 @@ public class DubboAutoConfiguration implements 
ApplicationContextAware, BeanDefi
         return new ServiceAnnotationPostProcessor(packagesToScan);
     }
 
-    @Override
-    public void setApplicationContext(ApplicationContext applicationContext) 
throws BeansException {
-        if (applicationContext instanceof ConfigurableApplicationContext) {
-            ConfigurableApplicationContext context = 
(ConfigurableApplicationContext) applicationContext;
-
-            // Why register ApplicationListener here?
-            DubboBootstrapApplicationListener 
dubboBootstrapApplicationListener = new DubboBootstrapApplicationListener();
-            
dubboBootstrapApplicationListener.setApplicationContext(applicationContext);
-            context.addApplicationListener(dubboBootstrapApplicationListener);
-        }
-    }
-
-    @Override
-    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry 
registry) throws BeansException {
-        // Remove the BeanDefinitions of ApplicationListener from 
DubboBeanUtils#registerCommonBeans(BeanDefinitionRegistry)
-        // TODO Refactoring in Dubbo 2.7.9
-        removeBeanDefinition(registry, 
DubboBootstrapApplicationListener.BEAN_NAME);
-    }
-
-    private void removeBeanDefinition(BeanDefinitionRegistry registry, String 
beanName) {
-        if (registry.containsBeanDefinition(beanName)) {
-            registry.removeBeanDefinition(beanName);
-        }
-    }
-
-    @Override
-    public void postProcessBeanFactory(ConfigurableListableBeanFactory 
beanFactory) throws BeansException {
-        // DO NOTHING
-    }
 }

Reply via email to