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
- }
}