diff --git a/CHANGELOG.md b/CHANGELOG.md index 59d3ccf56..da3463536 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,3 +14,4 @@ - [feat: support kafka lane.](https://github.com/Tencent/spring-cloud-tencent/pull/1765) - [fix: ApplicationContextAwareUtils may not be ready in postProcessAfterInitialization.](https://github.com/Tencent/spring-cloud-tencent/pull/1779) - [refactor:optimize metadata context operation.](https://github.com/Tencent/spring-cloud-tencent/pull/1773) +- [refactor: modify the initialization of ApplicationContextAwareUtils.](https://github.com/Tencent/spring-cloud-tencent/pull/1778) diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/endpoint/PolarisCircuitBreakerEndpointTest.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/endpoint/PolarisCircuitBreakerEndpointTest.java index 33d7b40e8..ab00861c5 100644 --- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/endpoint/PolarisCircuitBreakerEndpointTest.java +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/endpoint/PolarisCircuitBreakerEndpointTest.java @@ -47,7 +47,7 @@ import static org.mockito.Mockito.when; public class PolarisCircuitBreakerEndpointTest { private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() - .withBean(ApplicationContextAwareUtils.class) + .withInitializer(new ApplicationContextAwareUtils()) .withPropertyValues("spring.cloud.polaris.namespace=" + NAMESPACE_TEST) .withPropertyValues("spring.cloud.polaris.service=" + SERVICE_PROVIDER); diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/discovery/PolarisServiceDiscoveryTest.java b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/discovery/PolarisServiceDiscoveryTest.java index ede2ccb73..1c51bafa0 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/discovery/PolarisServiceDiscoveryTest.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/discovery/PolarisServiceDiscoveryTest.java @@ -19,14 +19,12 @@ package com.tencent.cloud.polaris.discovery; import java.util.List; -import com.tencent.cloud.common.util.ApplicationContextAwareUtils; import com.tencent.polaris.api.exception.PolarisException; import com.tencent.polaris.api.pojo.DefaultInstance; import com.tencent.polaris.api.pojo.DefaultServiceInstances; import com.tencent.polaris.api.pojo.ServiceInfo; import com.tencent.polaris.api.rpc.InstancesResponse; import com.tencent.polaris.api.rpc.ServicesResponse; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; @@ -36,7 +34,6 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.cloud.client.ServiceInstance; import org.springframework.context.annotation.Configuration; -import org.springframework.context.support.StaticApplicationContext; import static com.tencent.polaris.test.common.Consts.SERVICE_PROVIDER; import static java.util.Collections.singletonList; @@ -58,11 +55,6 @@ public class PolarisServiceDiscoveryTest { @InjectMocks private PolarisServiceDiscovery polarisServiceDiscovery; - @BeforeEach - void setUp() { - new ApplicationContextAwareUtils().setApplicationContext(new StaticApplicationContext()); - } - @Test public void testGetInstances() { DefaultServiceInstances mockDefaultServiceInstances = mock(DefaultServiceInstances.class); diff --git a/spring-cloud-starter-tencent-polaris-ratelimit/src/test/java/com/tencent/cloud/polaris/ratelimit/endpoint/PolarisRateLimitRuleEndpointTests.java b/spring-cloud-starter-tencent-polaris-ratelimit/src/test/java/com/tencent/cloud/polaris/ratelimit/endpoint/PolarisRateLimitRuleEndpointTests.java index b126d1a66..646be3b00 100644 --- a/spring-cloud-starter-tencent-polaris-ratelimit/src/test/java/com/tencent/cloud/polaris/ratelimit/endpoint/PolarisRateLimitRuleEndpointTests.java +++ b/spring-cloud-starter-tencent-polaris-ratelimit/src/test/java/com/tencent/cloud/polaris/ratelimit/endpoint/PolarisRateLimitRuleEndpointTests.java @@ -19,6 +19,7 @@ package com.tencent.cloud.polaris.ratelimit.endpoint; import java.util.Map; +import com.tencent.cloud.common.util.ApplicationContextAwareUtils; import com.tencent.cloud.polaris.context.ServiceRuleManager; import com.tencent.cloud.polaris.ratelimit.config.PolarisRateLimitProperties; import com.tencent.polaris.specification.api.v1.model.ModelProto; @@ -57,6 +58,7 @@ public class PolarisRateLimitRuleEndpointTests { PolarisRateLimitRuleEndpointAutoConfiguration.class, PolarisRateLimitAutoConfiguration.class, PolarisRateLimitAutoConfiguration.class)) + .withInitializer(new ApplicationContextAwareUtils()) .withPropertyValues("spring.application.name=" + SERVICE_PROVIDER) .withPropertyValues("server.port=" + PORT) .withPropertyValues("spring.cloud.polaris.address=grpc://127.0.0.1:10081") diff --git a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/FeignAutoConfigurationTest.java b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/FeignAutoConfigurationTest.java index 6a9ffff97..910b2b13e 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/FeignAutoConfigurationTest.java +++ b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/FeignAutoConfigurationTest.java @@ -40,9 +40,10 @@ public class FeignAutoConfigurationTest { RouterAutoConfiguration.class, RouterConfigModifierAutoConfiguration.class, PolarisContextAutoConfiguration.class, - FeignAutoConfiguration.class, - ApplicationContextAwareUtils.class - )).withPropertyValues("spring.application.name=test"); + FeignAutoConfiguration.class + )) + .withInitializer(new ApplicationContextAwareUtils()) + .withPropertyValues("spring.application.name=test"); @Test public void routerLabelInterceptor() { diff --git a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/RouterAutoConfigurationTests.java b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/RouterAutoConfigurationTests.java index a247766ce..c56709420 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/RouterAutoConfigurationTests.java +++ b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/RouterAutoConfigurationTests.java @@ -43,9 +43,10 @@ public class RouterAutoConfigurationTests { RouterAutoConfiguration.class, RouterConfigModifierAutoConfiguration.class, PolarisContextAutoConfiguration.class, - RouterAutoConfiguration.RouterLabelRestTemplateConfig.class, - ApplicationContextAwareUtils.class - )).withPropertyValues("spring.application.name=test"); + RouterAutoConfiguration.RouterLabelRestTemplateConfig.class + )) + .withInitializer(new ApplicationContextAwareUtils()) + .withPropertyValues("spring.application.name=test"); @Test public void testRouterLabelRestTemplateConfig() { diff --git a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/config/MetadataAutoConfiguration.java b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/config/MetadataAutoConfiguration.java index 387f3f6d8..bbe6d19a7 100644 --- a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/config/MetadataAutoConfiguration.java +++ b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/config/MetadataAutoConfiguration.java @@ -22,7 +22,6 @@ import java.util.List; import com.tencent.cloud.common.metadata.StaticMetadataManager; import com.tencent.cloud.common.spi.InstanceMetadataProvider; import com.tencent.cloud.common.spi.impl.DefaultInstanceMetadataProvider; -import com.tencent.cloud.common.util.ApplicationContextAwareUtils; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -46,8 +45,8 @@ public class MetadataAutoConfiguration { } @Bean - public InstanceMetadataProvider defaultInstanceMetadataProvider(ApplicationContextAwareUtils applicationContextAwareUtils) { - return new DefaultInstanceMetadataProvider(applicationContextAwareUtils); + public InstanceMetadataProvider defaultInstanceMetadataProvider() { + return new DefaultInstanceMetadataProvider(); } @Bean diff --git a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/spi/impl/DefaultInstanceMetadataProvider.java b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/spi/impl/DefaultInstanceMetadataProvider.java index 2ae78b835..48f908bb5 100644 --- a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/spi/impl/DefaultInstanceMetadataProvider.java +++ b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/spi/impl/DefaultInstanceMetadataProvider.java @@ -24,7 +24,6 @@ import java.util.Map; import java.util.Set; import com.tencent.cloud.common.spi.InstanceMetadataProvider; -import com.tencent.cloud.common.util.ApplicationContextAwareUtils; import com.tencent.cloud.common.util.inet.PolarisInetUtils; import com.tencent.polaris.api.utils.StringUtils; import com.tencent.polaris.metadata.core.constant.MetadataConstants; @@ -42,13 +41,6 @@ import static com.tencent.cloud.common.metadata.MetadataContext.LOCAL_SERVICE; */ public class DefaultInstanceMetadataProvider implements InstanceMetadataProvider { - private final ApplicationContextAwareUtils applicationContextAwareUtils; - - // ensure ApplicationContextAwareUtils init before - public DefaultInstanceMetadataProvider(ApplicationContextAwareUtils applicationContextAwareUtils) { - this.applicationContextAwareUtils = applicationContextAwareUtils; - } - @Override public Map getMetadata() { Map metadata = new HashMap<>(); diff --git a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/util/ApplicationContextAwareUtils.java b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/util/ApplicationContextAwareUtils.java index 991d0e3e3..0cb4e74b2 100644 --- a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/util/ApplicationContextAwareUtils.java +++ b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/util/ApplicationContextAwareUtils.java @@ -21,17 +21,16 @@ import com.tencent.polaris.api.utils.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.lang.NonNull; +import org.springframework.context.ApplicationContextInitializer; +import org.springframework.context.ConfigurableApplicationContext; /** * Spring Context Util. * * @author Hongwei Zhu */ -public class ApplicationContextAwareUtils implements ApplicationContextAware { +public class ApplicationContextAwareUtils implements ApplicationContextInitializer { private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationContextAwareUtils.class); @@ -45,11 +44,6 @@ public class ApplicationContextAwareUtils implements ApplicationContextAware { return applicationContext; } - @Override - public void setApplicationContext(@NonNull ApplicationContext applicationContext) throws BeansException { - ApplicationContextAwareUtils.applicationContext = applicationContext; - } - /** * Get application property. * @param key property name @@ -93,7 +87,7 @@ public class ApplicationContextAwareUtils implements ApplicationContextAware { } public static T getBeanIfExists(Class requiredType) { - return getBeanIfExists(requiredType, false); + return getBeanIfExists(requiredType, true); } public static T getBeanIfExists(Class requiredType, boolean warnIfFailed) { @@ -107,4 +101,9 @@ public class ApplicationContextAwareUtils implements ApplicationContextAware { return null; } } + + @Override + public void initialize(ConfigurableApplicationContext applicationContext) { + ApplicationContextAwareUtils.applicationContext = applicationContext; + } } diff --git a/spring-cloud-tencent-commons/src/main/resources/META-INF/spring.factories b/spring-cloud-tencent-commons/src/main/resources/META-INF/spring.factories index e962f0ff3..799f5cce6 100644 --- a/spring-cloud-tencent-commons/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-tencent-commons/src/main/resources/META-INF/spring.factories @@ -1,9 +1,10 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.tencent.cloud.common.util.inet.PolarisInetUtilsAutoConfiguration,\ - com.tencent.cloud.common.util.ApplicationContextAwareUtils,\ com.tencent.cloud.common.metadata.config.MetadataAutoConfiguration,\ com.tencent.cloud.common.metadata.endpoint.PolarisMetadataEndpointAutoConfiguration,\ com.tencent.cloud.common.async.PolarisAsyncPropertiesAutoConfiguration,\ com.tencent.cloud.common.async.PolarisAsyncConfiguration org.springframework.cloud.bootstrap.BootstrapConfiguration=\ com.tencent.cloud.common.util.inet.PolarisInetUtilsBootstrapConfiguration +org.springframework.context.ApplicationContextInitializer=\ + com.tencent.cloud.common.util.ApplicationContextAwareUtils diff --git a/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/metadata/StaticMetadataManagerTest.java b/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/metadata/StaticMetadataManagerTest.java index 6719038b6..c496e8c18 100644 --- a/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/metadata/StaticMetadataManagerTest.java +++ b/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/metadata/StaticMetadataManagerTest.java @@ -133,7 +133,7 @@ public class StaticMetadataManagerTest { when(metadataLocalProperties.getTransitive()).thenReturn(Collections.singletonList("k1")); StaticMetadataManager metadataManager = new StaticMetadataManager(metadataLocalProperties, - Arrays.asList(new MockedMetadataProvider(), new DefaultInstanceMetadataProvider(null))); + Arrays.asList(new MockedMetadataProvider(), new DefaultInstanceMetadataProvider())); Map metadata = metadataManager.getAllCustomMetadata(); assertThat(metadata.size()).isGreaterThanOrEqualTo(5); @@ -178,7 +178,7 @@ public class StaticMetadataManagerTest { when(metadataLocalProperties.getHeaders()).thenReturn(Arrays.asList("b", "d")); StaticMetadataManager metadataManager = new StaticMetadataManager(metadataLocalProperties, - Arrays.asList(new MockedMetadataProvider(), new DefaultInstanceMetadataProvider(null))); + Arrays.asList(new MockedMetadataProvider(), new DefaultInstanceMetadataProvider())); Map metadata = metadataManager.getMergedStaticMetadata(); assertThat(metadata.size()).isGreaterThanOrEqualTo(8); diff --git a/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/util/ApplicationContextAwareUtilsTest.java b/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/util/ApplicationContextAwareUtilsTest.java index 56c969d02..c41f48e9d 100644 --- a/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/util/ApplicationContextAwareUtilsTest.java +++ b/spring-cloud-tencent-commons/src/test/java/com/tencent/cloud/common/util/ApplicationContextAwareUtilsTest.java @@ -21,8 +21,8 @@ import com.tencent.cloud.common.async.PolarisAsyncConfiguration; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.NoSuchBeanDefinitionException; -import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.context.annotation.Configuration; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -35,13 +35,13 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; public class ApplicationContextAwareUtilsTest { private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(ApplicationContextAwareUtils.class)) + .withInitializer(new ApplicationContextAwareUtils()) + .withUserConfiguration(TestConfig.class) .withPropertyValues("key1=value1"); @Test public void testApplicationContextAwareUtils() { this.contextRunner.run(context -> { - assertThat(context).hasSingleBean(ApplicationContextAwareUtils.class); assertThat(ApplicationContextAwareUtils.getApplicationContext()).isNotNull(); // test getProperties @@ -53,14 +53,19 @@ public class ApplicationContextAwareUtilsTest { assertThat(ApplicationContextAwareUtils.getProperties("key2", "defaultValue")).isEqualTo("defaultValue"); // test getBean - assertThat(ApplicationContextAwareUtils.getBean(ApplicationContextAwareUtils.class)).isNotNull(); + assertThat(ApplicationContextAwareUtils.getBean(TestConfig.class)).isNotNull(); assertThatThrownBy(() -> { ApplicationContextAwareUtils.getBean(PolarisAsyncConfiguration.class); }).isInstanceOf(NoSuchBeanDefinitionException.class); // test getBeanIfExists - assertThat(ApplicationContextAwareUtils.getBeanIfExists(ApplicationContextAwareUtils.class)).isNotNull(); + assertThat(ApplicationContextAwareUtils.getBeanIfExists(TestConfig.class)).isNotNull(); assertThat(ApplicationContextAwareUtils.getBeanIfExists(PolarisAsyncConfiguration.class)).isNull(); }); } + + @Configuration + static class TestConfig { + + } } diff --git a/spring-cloud-tencent-commons/src/test/java/org/springframework/tsf/core/util/TsfSpringContextAwareTest.java b/spring-cloud-tencent-commons/src/test/java/org/springframework/tsf/core/util/TsfSpringContextAwareTest.java index 1a76adb15..b03d531d1 100644 --- a/spring-cloud-tencent-commons/src/test/java/org/springframework/tsf/core/util/TsfSpringContextAwareTest.java +++ b/spring-cloud-tencent-commons/src/test/java/org/springframework/tsf/core/util/TsfSpringContextAwareTest.java @@ -22,8 +22,8 @@ import com.tencent.cloud.common.util.ApplicationContextAwareUtils; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.NoSuchBeanDefinitionException; -import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.context.annotation.Configuration; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatNoException; @@ -37,7 +37,8 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; public class TsfSpringContextAwareTest { private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(ApplicationContextAwareUtils.class)) + .withInitializer(new ApplicationContextAwareUtils()) + .withUserConfiguration(TestConfig.class) .withPropertyValues("key1=value1"); @Test @@ -56,10 +57,15 @@ public class TsfSpringContextAwareTest { assertThat(TsfSpringContextAware.getProperties("key2", "defaultValue")).isEqualTo("defaultValue"); // test getBean - assertThat(TsfSpringContextAware.getBean(ApplicationContextAwareUtils.class)).isNotNull(); + assertThat(TsfSpringContextAware.getBean(TestConfig.class)).isNotNull(); assertThatThrownBy(() -> { TsfSpringContextAware.getBean(PolarisAsyncConfiguration.class); }).isInstanceOf(NoSuchBeanDefinitionException.class); }); } + + @Configuration + static class TestConfig { + + } } diff --git a/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/src/main/java/com/tencent/cloud/quickstart/callee/service/CalleeServiceChangeCallback.java b/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/src/main/java/com/tencent/cloud/quickstart/callee/service/CalleeServiceChangeCallback.java new file mode 100644 index 000000000..c68e8fc75 --- /dev/null +++ b/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/src/main/java/com/tencent/cloud/quickstart/callee/service/CalleeServiceChangeCallback.java @@ -0,0 +1,60 @@ +/* + * Tencent is pleased to support the open source community by making spring-cloud-tencent available. + * + * Copyright (C) 2021 Tencent. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * Unless required by applicable law or agreed to in writing, software distributed + * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + * CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ + +package com.tencent.cloud.quickstart.callee.service; + +import java.util.List; + +import com.tencent.cloud.polaris.discovery.refresh.ServiceInstanceChangeCallback; +import com.tencent.cloud.polaris.discovery.refresh.ServiceInstanceChangeListener; +import com.tencent.polaris.api.pojo.Instance; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.stereotype.Component; + +/** + * Call back for QuickstartCalleeService. + * + * @author Haotian Zhang + */ +@Component +@ServiceInstanceChangeListener(serviceName = "QuickstartCalleeService") +public class CalleeServiceChangeCallback implements ServiceInstanceChangeCallback { + + private static final Logger LOG = LoggerFactory.getLogger(CalleeServiceChangeCallback.class); + + @Override + public void callback(List currentServiceInstances, List addServiceInstances, List deleteServiceInstances) { + String current = generateNodeList(currentServiceInstances); + String add = generateNodeList(addServiceInstances); + String delete = generateNodeList(deleteServiceInstances); + LOG.info("current: {}, add: {}, delete: {}", current, add, delete); + } + + private String generateNodeList(List deleteServiceInstances) { + StringBuilder nodeListStr = new StringBuilder("["); + for (Instance instance : deleteServiceInstances) { + if (nodeListStr.length() > 1) { + nodeListStr.append(", "); + } + nodeListStr.append(instance.getHost()).append(":").append(instance.getPort()); + } + nodeListStr.append("]"); + return nodeListStr.toString(); + } +}