You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by cr...@apache.org on 2023/06/29 02:31:41 UTC

[dubbo] branch 3.2 updated: Enable spring bean autowired to get scope model in advance (#12608)

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

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


The following commit(s) were added to refs/heads/3.2 by this push:
     new 563a0e472a Enable spring bean autowired to get scope model in advance (#12608)
563a0e472a is described below

commit 563a0e472ab50d2d697e2f0415c80b68ad6b17bd
Author: Albumen Kevin <jh...@gmail.com>
AuthorDate: Thu Jun 29 10:31:36 2023 +0800

    Enable spring bean autowired to get scope model in advance (#12608)
    
    * Enable spring bean autowired to get scope model in advance
    
    * Fix uts
    
    * Fix uts
---
 .../java/org/apache/dubbo/config/spring/ServiceBean.java   | 14 ++++++++++----
 .../factory/annotation/ServiceAnnotationPostProcessor.java |  1 +
 .../config/spring/schema/DubboBeanDefinitionParser.java    |  3 +++
 .../apache/dubbo/config/spring/util/DubboBeanUtils.java    |  6 +++---
 .../org/apache/dubbo/config/spring/ServiceBeanTest.java    |  4 ++--
 .../config/spring/status/DataSourceStatusCheckerTest.java  |  4 ++--
 6 files changed, 21 insertions(+), 11 deletions(-)

diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ServiceBean.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ServiceBean.java
index 0d209a14f1..8fd1ed9b11 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ServiceBean.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ServiceBean.java
@@ -52,24 +52,30 @@ public class ServiceBean<T> extends ServiceConfig<T> implements InitializingBean
 
     private ApplicationEventPublisher applicationEventPublisher;
 
-    public ServiceBean() {
+    public ServiceBean(ApplicationContext applicationContext) {
         super();
         this.service = null;
+        this.applicationContext = applicationContext;
+        this.setScopeModel(DubboBeanUtils.getModuleModel(applicationContext));
     }
 
-    public ServiceBean(ModuleModel moduleModel) {
+    public ServiceBean(ApplicationContext applicationContext, ModuleModel moduleModel) {
         super(moduleModel);
         this.service = null;
+        this.applicationContext = applicationContext;
     }
 
-    public ServiceBean(Service service) {
+    public ServiceBean(ApplicationContext applicationContext, Service service) {
         super(service);
         this.service = service;
+        this.applicationContext = applicationContext;
+        this.setScopeModel(DubboBeanUtils.getModuleModel(applicationContext));
     }
 
-    public ServiceBean(ModuleModel moduleModel, Service service) {
+    public ServiceBean(ApplicationContext applicationContext, ModuleModel moduleModel, Service service) {
         super(moduleModel, service);
         this.service = service;
+        this.applicationContext = applicationContext;
     }
 
     @Override
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationPostProcessor.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationPostProcessor.java
index 4ce2c0caef..b8fff6b83e 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationPostProcessor.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationPostProcessor.java
@@ -428,6 +428,7 @@ public class ServiceAnnotationPostProcessor implements BeanDefinitionRegistryPos
         BeanDefinitionBuilder builder = rootBeanDefinition(ServiceBean.class);
 
         AbstractBeanDefinition beanDefinition = builder.getBeanDefinition();
+        beanDefinition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_CONSTRUCTOR);
 
         MutablePropertyValues propertyValues = beanDefinition.getPropertyValues();
 
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/DubboBeanDefinitionParser.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/DubboBeanDefinitionParser.java
index 31dbb290bf..9250b27243 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/DubboBeanDefinitionParser.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/DubboBeanDefinitionParser.java
@@ -98,6 +98,9 @@ public class DubboBeanDefinitionParser implements BeanDefinitionParser {
         RootBeanDefinition beanDefinition = new RootBeanDefinition();
         beanDefinition.setBeanClass(beanClass);
         beanDefinition.setLazyInit(false);
+        if (ServiceBean.class.equals(beanClass)) {
+            beanDefinition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_CONSTRUCTOR);
+        }
         // config id
         String configId = resolveAttribute(element, "id", parserContext);
         if (StringUtils.isNotEmpty(configId)) {
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 c369b1173e..ae6854142c 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
@@ -181,7 +181,7 @@ public interface DubboBeanUtils {
 
     static DubboSpringInitContext getInitializationContext(BeanFactory beanFactory) {
         String beanName = DubboSpringInitContext.class.getName();
-        if (beanFactory.containsBean(beanName)) {
+        if (beanFactory != null && beanFactory.containsBean(beanName)) {
             return beanFactory.getBean(beanName, DubboSpringInitContext.class);
         }
         return null;
@@ -189,7 +189,7 @@ public interface DubboBeanUtils {
 
     static ApplicationModel getApplicationModel(BeanFactory beanFactory) {
         String beanName = ApplicationModel.class.getName();
-        if (beanFactory.containsBean(beanName)) {
+        if (beanFactory != null && beanFactory.containsBean(beanName)) {
             return beanFactory.getBean(beanName, ApplicationModel.class);
         }
         return null;
@@ -197,7 +197,7 @@ public interface DubboBeanUtils {
 
     static ModuleModel getModuleModel(BeanFactory beanFactory) {
         String beanName = ModuleModel.class.getName();
-        if (beanFactory.containsBean(beanName)) {
+        if (beanFactory != null && beanFactory.containsBean(beanName)) {
             return beanFactory.getBean(beanName, ModuleModel.class);
         }
         return null;
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/ServiceBeanTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/ServiceBeanTest.java
index f4fe893a49..804575eac4 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/ServiceBeanTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/ServiceBeanTest.java
@@ -43,7 +43,7 @@ class ServiceBeanTest {
     @Test
     void testGetService() {
         TestService service = mock(TestService.class);
-        ServiceBean serviceBean = new ServiceBean(service);
+        ServiceBean serviceBean = new ServiceBean(null, service);
 
         Service beanService = serviceBean.getService();
         MatcherAssert.assertThat(beanService, not(nullValue()));
@@ -52,4 +52,4 @@ class ServiceBeanTest {
     abstract class TestService implements Service {
 
     }
-}
\ No newline at end of file
+}
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/status/DataSourceStatusCheckerTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/status/DataSourceStatusCheckerTest.java
index 14d74f4113..b17e04a7f2 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/status/DataSourceStatusCheckerTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/status/DataSourceStatusCheckerTest.java
@@ -51,7 +51,7 @@ class DataSourceStatusCheckerTest {
     public void setUp() throws Exception {
         initMocks(this);
         this.dataSourceStatusChecker = new DataSourceStatusChecker(applicationContext);
-        new ServiceBean<Object>().setApplicationContext(applicationContext);
+        new ServiceBean<Object>(applicationContext).setApplicationContext(applicationContext);
     }
 
     @AfterEach
@@ -105,4 +105,4 @@ class DataSourceStatusCheckerTest {
 
         assertThat(status.getLevel(), is(Status.Level.ERROR));
     }
-}
\ No newline at end of file
+}