From 1abbcfb20f1d42d8acd9b0a225e3c5049559fa1b Mon Sep 17 00:00:00 2001 From: Mercy Ma Date: Tue, 9 Jun 2026 23:58:21 +0800 Subject: [PATCH 1/5] Bump parent pom version to 0.3.3 Update the parent POM reference for io.github.microsphere-projects:microsphere-build from 0.3.1 to 0.3.3 in pom.xml to pick up build configuration updates and fixes in the newer parent release. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 471a8114..9b5501a2 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ io.github.microsphere-projects microsphere-build - 0.3.1 + 0.3.3 4.0.0 From dcb61868af5cdf7c9f85155f3dee924be0d53c52 Mon Sep 17 00:00:00 2001 From: Mercy Ma Date: Tue, 9 Jun 2026 23:58:56 +0800 Subject: [PATCH 2/5] Bump microsphere-spring-boot version to 0.1.20 Update microsphere-spring-boot.version in microsphere-spring-cloud-parent/pom.xml from 0.1.19 to 0.1.20 to use the latest release and pull in related fixes/updates. --- microsphere-spring-cloud-parent/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/microsphere-spring-cloud-parent/pom.xml b/microsphere-spring-cloud-parent/pom.xml index 5102b4f6..c443dc43 100644 --- a/microsphere-spring-cloud-parent/pom.xml +++ b/microsphere-spring-cloud-parent/pom.xml @@ -20,7 +20,7 @@ - 0.1.19 + 0.1.20 1.21.4 5.14.4 From 61368306c3962c79021497638abf8926b12fd59e Mon Sep 17 00:00:00 2001 From: Mercy Ma Date: Wed, 10 Jun 2026 08:38:58 +0800 Subject: [PATCH 3/5] Add discovery availability conditional annotations Introduce composed conditional annotations for discovery clients and update auto-configs to use them. Adds ConditionalOnBlockingDiscoveryAvailable and ConditionalOnReactiveDiscoveryAvailable (composing ConditionalOnClass + ConditionalOnDiscoveryEnabled + respective reactive/blocking enablement) and a REACTIVE_DISCOVERY_CLIENT_CLASS_NAME constant. Update DiscoveryClientAutoConfiguration and ReactiveDiscoveryClientAutoConfiguration to use the new annotations and clean up related imports; also remove unused imports from ConditionalOnFeaturesAvailable. --- .../ConditionalOnFeaturesAvailable.java | 4 -- .../DiscoveryClientAutoConfiguration.java | 11 +-- ...ctiveDiscoveryClientAutoConfiguration.java | 11 +-- ...nditionalOnBlockingDiscoveryAvailable.java | 70 +++++++++++++++++++ ...nditionalOnReactiveDiscoveryAvailable.java | 70 +++++++++++++++++++ .../constants/DiscoveryClientConstants.java | 8 +++ 6 files changed, 152 insertions(+), 22 deletions(-) create mode 100644 microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/discovery/condition/ConditionalOnBlockingDiscoveryAvailable.java create mode 100644 microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/discovery/condition/ConditionalOnReactiveDiscoveryAvailable.java diff --git a/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/condition/ConditionalOnFeaturesAvailable.java b/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/condition/ConditionalOnFeaturesAvailable.java index c82fa259..8f675409 100644 --- a/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/condition/ConditionalOnFeaturesAvailable.java +++ b/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/condition/ConditionalOnFeaturesAvailable.java @@ -18,16 +18,12 @@ import io.microsphere.spring.cloud.commons.constants.CommonsPropertyConstants; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.cloud.client.CommonsClientAutoConfiguration; import org.springframework.cloud.client.actuator.FeaturesEndpoint; -import org.springframework.cloud.client.actuator.HasFeatures; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; -import static io.microsphere.spring.cloud.commons.constants.CommonsPropertyConstants.FEATURES_ENABLED_PROPERTY_NAME; import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.ElementType.TYPE; import static java.lang.annotation.RetentionPolicy.RUNTIME; diff --git a/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/discovery/autoconfigure/DiscoveryClientAutoConfiguration.java b/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/discovery/autoconfigure/DiscoveryClientAutoConfiguration.java index 525fd083..f53a997b 100644 --- a/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/discovery/autoconfigure/DiscoveryClientAutoConfiguration.java +++ b/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/discovery/autoconfigure/DiscoveryClientAutoConfiguration.java @@ -18,19 +18,16 @@ import io.microsphere.annotation.ConfigurationProperty; import io.microsphere.spring.cloud.client.discovery.UnionDiscoveryClient; +import io.microsphere.spring.cloud.client.discovery.condition.ConditionalOnBlockingDiscoveryAvailable; import org.springframework.boot.autoconfigure.AutoConfigureBefore; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.client.CommonsClientAutoConfiguration; -import org.springframework.cloud.client.ConditionalOnBlockingDiscoveryEnabled; -import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import static io.microsphere.annotation.ConfigurationProperty.APPLICATION_SOURCE; import static io.microsphere.spring.cloud.client.discovery.constants.DiscoveryClientConstants.COMMONS_CLIENT_AUTO_CONFIGURATION_CLASS_NAME; -import static io.microsphere.spring.cloud.client.discovery.constants.DiscoveryClientConstants.DISCOVERY_CLIENT_CLASS_NAME; import static io.microsphere.spring.cloud.commons.constants.CommonsPropertyConstants.MICROSPHERE_SPRING_CLOUD_PROPERTY_NAME_PREFIX; /** @@ -42,11 +39,7 @@ * @since 1.0.0 */ @Configuration(proxyBeanMethods = false) -@ConditionalOnClass(name = { - DISCOVERY_CLIENT_CLASS_NAME -}) -@ConditionalOnDiscoveryEnabled -@ConditionalOnBlockingDiscoveryEnabled +@ConditionalOnBlockingDiscoveryAvailable @AutoConfigureBefore(name = { COMMONS_CLIENT_AUTO_CONFIGURATION_CLASS_NAME }) diff --git a/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/discovery/autoconfigure/ReactiveDiscoveryClientAutoConfiguration.java b/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/discovery/autoconfigure/ReactiveDiscoveryClientAutoConfiguration.java index 8cb3a906..017d49b5 100644 --- a/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/discovery/autoconfigure/ReactiveDiscoveryClientAutoConfiguration.java +++ b/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/discovery/autoconfigure/ReactiveDiscoveryClientAutoConfiguration.java @@ -18,18 +18,15 @@ package io.microsphere.spring.cloud.client.discovery.autoconfigure; import io.microsphere.spring.cloud.client.discovery.ReactiveDiscoveryClientAdapter; +import io.microsphere.spring.cloud.client.discovery.condition.ConditionalOnReactiveDiscoveryAvailable; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.cloud.client.ConditionalOnBlockingDiscoveryEnabled; -import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled; -import org.springframework.cloud.client.ConditionalOnReactiveDiscoveryEnabled; import org.springframework.cloud.client.discovery.ReactiveDiscoveryClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import static io.microsphere.spring.cloud.client.discovery.constants.DiscoveryClientConstants.DISCOVERY_CLIENT_CLASS_NAME; import static io.microsphere.spring.cloud.client.discovery.constants.DiscoveryClientConstants.REACTIVE_COMMONS_CLIENT_AUTO_CONFIGURATION_CLASS_NAME; import static io.microsphere.spring.cloud.client.discovery.constants.DiscoveryClientConstants.REACTIVE_COMPOSITE_DISCOVERY_CLIENT_AUTO_CONFIGURATION_CLASS_NAME; import static io.microsphere.spring.cloud.client.discovery.constants.DiscoveryClientConstants.SIMPLE_REACTIVE_DISCOVERY_CLIENT_AUTO_CONFIGURATION_CLASS_NAME; @@ -43,11 +40,7 @@ * @since 1.0.0 */ @Configuration(proxyBeanMethods = false) -@ConditionalOnClass(name = { - DISCOVERY_CLIENT_CLASS_NAME -}) -@ConditionalOnDiscoveryEnabled -@ConditionalOnReactiveDiscoveryEnabled +@ConditionalOnReactiveDiscoveryAvailable @AutoConfigureBefore(name = { REACTIVE_COMMONS_CLIENT_AUTO_CONFIGURATION_CLASS_NAME }) diff --git a/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/discovery/condition/ConditionalOnBlockingDiscoveryAvailable.java b/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/discovery/condition/ConditionalOnBlockingDiscoveryAvailable.java new file mode 100644 index 00000000..8ba6cc32 --- /dev/null +++ b/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/discovery/condition/ConditionalOnBlockingDiscoveryAvailable.java @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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 io.microsphere.spring.cloud.client.discovery.condition; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.cloud.client.ConditionalOnBlockingDiscoveryEnabled; +import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled; + +import java.lang.annotation.Documented; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static io.microsphere.spring.cloud.client.discovery.constants.DiscoveryClientConstants.DISCOVERY_CLIENT_CLASS_NAME; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +/** + * A condition that checks if Blocking Spring Cloud Discovery is available. + *

+ * This annotation combines {@link ConditionalOnClass} (checking for the presence of {@code DiscoveryClient}), + * {@link ConditionalOnDiscoveryEnabled}, and {@link ConditionalOnBlockingDiscoveryEnabled} to ensure that + * the discovery client is both present in the classpath and enabled for blocking operations. + * + *

Example Usage:

+ *
{@code
+ * @Configuration
+ * @ConditionalOnDiscoveryAvailable
+ * public class DiscoveryClientConfiguration {
+ *
+ *     @Bean
+ *     public MyService myService(DiscoveryClient discoveryClient) {
+ *         return new MyService(discoveryClient);
+ *     }
+ * }
+ * }
+ * + * @author Mercy + * @see ConditionalOnDiscoveryEnabled + * @see ConditionalOnBlockingDiscoveryEnabled + * @see ConditionalOnClass + * @since 1.0.0 + */ +@Target({TYPE, METHOD}) +@Retention(RUNTIME) +@Documented +@Inherited +@ConditionalOnClass(name = { + DISCOVERY_CLIENT_CLASS_NAME +}) +@ConditionalOnDiscoveryEnabled +@ConditionalOnBlockingDiscoveryEnabled +public @interface ConditionalOnBlockingDiscoveryAvailable { +} diff --git a/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/discovery/condition/ConditionalOnReactiveDiscoveryAvailable.java b/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/discovery/condition/ConditionalOnReactiveDiscoveryAvailable.java new file mode 100644 index 00000000..bc691817 --- /dev/null +++ b/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/discovery/condition/ConditionalOnReactiveDiscoveryAvailable.java @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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 io.microsphere.spring.cloud.client.discovery.condition; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled; +import org.springframework.cloud.client.ConditionalOnReactiveDiscoveryEnabled; + +import java.lang.annotation.Documented; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static io.microsphere.spring.cloud.client.discovery.constants.DiscoveryClientConstants.REACTIVE_DISCOVERY_CLIENT_CLASS_NAME; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +/** + * {@link ConditionalOnReactiveDiscoveryEnabled} and {@link ConditionalOnClass} for Reactive Discovery Client. + *

+ * This annotation can be used to conditionally enable a bean or configuration only when: + *

    + *
  • The Spring Cloud Discovery is enabled ({@link ConditionalOnDiscoveryEnabled}).
  • + *
  • The Reactive Discovery is explicitly enabled ({@link ConditionalOnReactiveDiscoveryEnabled}).
  • + *
  • The Reactive Discovery Client class is present on the classpath.
  • + *
+ * + *

Example Usage:

+ *
{@code
+ * @Configuration
+ * public class ReactiveDiscoveryConfig {
+ *
+ *     @Bean
+ *     @ConditionalOnReactiveDiscoveryAvailable
+ *     public MyReactiveService myReactiveService(ReactiveDiscoveryClient client) {
+ *         return new MyReactiveService(client);
+ *     }
+ * }
+ * }
+ * + * @author Mercy + * @since 1.0.0 + */ +@Target({TYPE, METHOD}) +@Retention(RUNTIME) +@Documented +@Inherited +@ConditionalOnClass(name = { + REACTIVE_DISCOVERY_CLIENT_CLASS_NAME +}) +@ConditionalOnDiscoveryEnabled +@ConditionalOnReactiveDiscoveryEnabled +public @interface ConditionalOnReactiveDiscoveryAvailable { +} diff --git a/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/discovery/constants/DiscoveryClientConstants.java b/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/discovery/constants/DiscoveryClientConstants.java index 5cce42f7..a2d8b981 100644 --- a/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/discovery/constants/DiscoveryClientConstants.java +++ b/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/discovery/constants/DiscoveryClientConstants.java @@ -19,6 +19,7 @@ import org.springframework.cloud.client.CommonsClientAutoConfiguration; import org.springframework.cloud.client.ReactiveCommonsClientAutoConfiguration; import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.client.discovery.ReactiveDiscoveryClient; import org.springframework.cloud.client.discovery.composite.CompositeDiscoveryClient; import org.springframework.cloud.client.discovery.composite.reactive.ReactiveCompositeDiscoveryClientAutoConfiguration; import org.springframework.cloud.client.discovery.simple.reactive.SimpleReactiveDiscoveryClientAutoConfiguration; @@ -38,6 +39,13 @@ public interface DiscoveryClientConstants { */ String DISCOVERY_CLIENT_CLASS_NAME = "org.springframework.cloud.client.discovery.DiscoveryClient"; + /** + * The class name of {@link ReactiveDiscoveryClient} + * + * @see org.springframework.cloud.client.discovery.ReactiveDiscoveryClient + */ + String REACTIVE_DISCOVERY_CLIENT_CLASS_NAME = "org.springframework.cloud.client.discovery.ReactiveDiscoveryClient"; + /** * The class name of {@link CompositeDiscoveryClient} * From a83c9af0fb70a2bec7453fb3f342dd821e6121e3 Mon Sep 17 00:00:00 2001 From: Mercy Ma Date: Wed, 10 Jun 2026 09:56:41 +0800 Subject: [PATCH 4/5] Add auto-registration condition and web modules Introduce a new ConditionalOnAutoServiceRegistrationAvailable meta-annotation and update web auto-configurations to rely on Microsphere web availability conditions. POM changes add Microsphere webmvc/webflux/actuator modules (reorganize dependency ordering and move aspectj to the bottom) and a small parent POM spacing tweak. WebMvcServiceRegistryAutoConfiguration and WebFluxServiceRegistryAutoConfiguration now use ConditionalOnWebMvcAvailable / ConditionalOnWebFluxAvailable, AutoConfigureAfter against Microsphere web auto-configs and ServiceRegistryAutoConfiguration, and reference the new auto-registration condition. Tests updated to remove explicit EnableWebMvcExtension/EnableWebFluxExtension annotations. --- microsphere-spring-cloud-commons/pom.xml | 39 ++++++--------- ...bFluxServiceRegistryAutoConfiguration.java | 14 ++++-- ...ebMvcServiceRegistryAutoConfiguration.java | 13 +++-- .../WebServiceRegistryAutoConfiguration.java | 15 ------ ...nalOnAutoServiceRegistrationAvailable.java | 49 +++++++++++++++++++ ...xServiceRegistryAutoConfigurationTest.java | 2 - ...cServiceRegistryAutoConfigurationTest.java | 2 - microsphere-spring-cloud-parent/pom.xml | 1 + 8 files changed, 86 insertions(+), 49 deletions(-) create mode 100644 microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/service/registry/condition/ConditionalOnAutoServiceRegistrationAvailable.java diff --git a/microsphere-spring-cloud-commons/pom.xml b/microsphere-spring-cloud-commons/pom.xml index 216f6291..f7b1863a 100644 --- a/microsphere-spring-cloud-commons/pom.xml +++ b/microsphere-spring-cloud-commons/pom.xml @@ -20,9 +20,21 @@ + - org.aspectj - aspectjweaver + io.github.microsphere-projects + microsphere-spring-boot-webmvc + + + + io.github.microsphere-projects + microsphere-spring-boot-webflux + + + + io.github.microsphere-projects + microsphere-spring-boot-actuator + true @@ -109,28 +121,9 @@ true - - - io.github.microsphere-projects - microsphere-spring-boot-core - - - - io.github.microsphere-projects - microsphere-spring-boot-actuator - true - - - io.github.microsphere-projects - microsphere-spring-webmvc - true - - - - io.github.microsphere-projects - microsphere-spring-webflux - true + org.aspectj + aspectjweaver diff --git a/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/service/registry/autoconfigure/WebFluxServiceRegistryAutoConfiguration.java b/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/service/registry/autoconfigure/WebFluxServiceRegistryAutoConfiguration.java index ed3baab5..ffa2dcab 100644 --- a/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/service/registry/autoconfigure/WebFluxServiceRegistryAutoConfiguration.java +++ b/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/service/registry/autoconfigure/WebFluxServiceRegistryAutoConfiguration.java @@ -16,19 +16,25 @@ */ package io.microsphere.spring.cloud.client.service.registry.autoconfigure; +import io.microsphere.spring.boot.webflux.autoconfigure.WebFluxAutoConfiguration; +import io.microsphere.spring.boot.webflux.autoconfigure.condition.ConditionalOnWebFluxAvailable; +import io.microsphere.spring.cloud.client.service.registry.condition.ConditionalOnAutoServiceRegistrationAvailable; import io.microsphere.spring.web.metadata.WebEndpointMapping; -import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.cloud.client.serviceregistry.ServiceRegistry; -import static org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type.REACTIVE; - /** * Auto-Configuration class for {@link ServiceRegistry ServiceRegistry} on the Spring WebFlux Application * * @author Mercy * @since 1.0.0 */ -@ConditionalOnWebApplication(type = REACTIVE) +@ConditionalOnWebFluxAvailable +@ConditionalOnAutoServiceRegistrationAvailable +@AutoConfigureAfter(value = { + WebFluxAutoConfiguration.class, + ServiceRegistryAutoConfiguration.class +}) public class WebFluxServiceRegistryAutoConfiguration extends WebServiceRegistryAutoConfiguration { /** diff --git a/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/service/registry/autoconfigure/WebMvcServiceRegistryAutoConfiguration.java b/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/service/registry/autoconfigure/WebMvcServiceRegistryAutoConfiguration.java index 9c133fbe..a3cd328c 100644 --- a/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/service/registry/autoconfigure/WebMvcServiceRegistryAutoConfiguration.java +++ b/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/service/registry/autoconfigure/WebMvcServiceRegistryAutoConfiguration.java @@ -16,12 +16,15 @@ */ package io.microsphere.spring.cloud.client.service.registry.autoconfigure; +import io.microsphere.spring.boot.webmvc.autoconfigure.WebMvcAutoConfiguration; +import io.microsphere.spring.boot.webmvc.autoconfigure.condition.ConditionalOnWebMvcAvailable; +import io.microsphere.spring.cloud.client.service.registry.condition.ConditionalOnAutoServiceRegistrationAvailable; import io.microsphere.spring.web.metadata.WebEndpointMapping; import io.microsphere.util.ValueHolder; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.web.servlet.DispatcherServletRegistrationBean; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.cloud.client.serviceregistry.ServiceRegistry; @@ -33,7 +36,6 @@ import static io.microsphere.util.ArrayUtils.EMPTY_STRING_ARRAY; import static io.microsphere.util.ArrayUtils.arrayEquals; import static java.lang.Boolean.FALSE; -import static org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type.SERVLET; /** * Auto-Configuration class for {@link ServiceRegistry ServiceRegistry} on the Spring WebMVC Application @@ -41,7 +43,12 @@ * @author Mercy * @since 1.0.0 */ -@ConditionalOnWebApplication(type = SERVLET) +@ConditionalOnWebMvcAvailable +@ConditionalOnAutoServiceRegistrationAvailable +@AutoConfigureAfter(value = { + WebMvcAutoConfiguration.class, + ServiceRegistryAutoConfiguration.class +}) public class WebMvcServiceRegistryAutoConfiguration extends WebServiceRegistryAutoConfiguration { private static final String[] DEFAULT_URL_MAPPINGS = {"/*"}; diff --git a/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/service/registry/autoconfigure/WebServiceRegistryAutoConfiguration.java b/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/service/registry/autoconfigure/WebServiceRegistryAutoConfiguration.java index 4b17e4e9..48ec8a94 100644 --- a/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/service/registry/autoconfigure/WebServiceRegistryAutoConfiguration.java +++ b/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/service/registry/autoconfigure/WebServiceRegistryAutoConfiguration.java @@ -17,19 +17,14 @@ package io.microsphere.spring.cloud.client.service.registry.autoconfigure; import io.microsphere.logging.Logger; -import io.microsphere.spring.cloud.client.service.registry.condition.ConditionalOnAutoServiceRegistrationEnabled; import io.microsphere.spring.web.event.WebEndpointMappingsReadyEvent; import io.microsphere.spring.web.metadata.WebEndpointMapping; import org.springframework.beans.factory.ObjectProvider; 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.ConditionalOnClass; import org.springframework.cloud.client.serviceregistry.Registration; import org.springframework.cloud.client.serviceregistry.ServiceRegistry; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationListener; -import org.springframework.context.annotation.Configuration; import java.util.Collection; import java.util.Iterator; @@ -45,16 +40,6 @@ * @author Mercy * @since 1.0.0 */ -@Configuration(proxyBeanMethods = false) -@ConditionalOnClass(name = { - "io.microsphere.spring.web.metadata.WebEndpointMapping", - "io.microsphere.spring.web.event.WebEndpointMappingsReadyEvent" -}) -@ConditionalOnBean(Registration.class) -@ConditionalOnAutoServiceRegistrationEnabled -@AutoConfigureAfter(value = { - ServiceRegistryAutoConfiguration.class -}) public abstract class WebServiceRegistryAutoConfiguration implements ApplicationListener { protected final Logger logger = getLogger(getClass()); diff --git a/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/service/registry/condition/ConditionalOnAutoServiceRegistrationAvailable.java b/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/service/registry/condition/ConditionalOnAutoServiceRegistrationAvailable.java new file mode 100644 index 00000000..0c7e7ed8 --- /dev/null +++ b/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/service/registry/condition/ConditionalOnAutoServiceRegistrationAvailable.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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 io.microsphere.spring.cloud.client.service.registry.condition; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.cloud.client.serviceregistry.AutoServiceRegistration; +import org.springframework.cloud.client.serviceregistry.Registration; +import org.springframework.core.annotation.AliasFor; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static io.microsphere.spring.cloud.commons.constants.CommonsPropertyConstants.SERVICE_REGISTRY_AUTO_REGISTRATION_ENABLED_PROPERTY_NAME; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +/** + * The conditional annotation meta-annotates {@link ConditionalOnProperty @ConditionalOnProperty} for + * {@link AutoServiceRegistration Service Registry Auto-Registration} enabled. + * + * @author Mercy + * @see AutoServiceRegistration + * @see ConditionalOnProperty + * @since 1.0.0 + */ +@Retention(RUNTIME) +@Target({TYPE, METHOD}) +@Documented +@ConditionalOnBean(Registration.class) +@ConditionalOnAutoServiceRegistrationEnabled +public @interface ConditionalOnAutoServiceRegistrationAvailable { +} \ No newline at end of file diff --git a/microsphere-spring-cloud-commons/src/test/java/io/microsphere/spring/cloud/client/service/registry/autoconfigure/WebFluxServiceRegistryAutoConfigurationTest.java b/microsphere-spring-cloud-commons/src/test/java/io/microsphere/spring/cloud/client/service/registry/autoconfigure/WebFluxServiceRegistryAutoConfigurationTest.java index cdd2d691..24223f7b 100644 --- a/microsphere-spring-cloud-commons/src/test/java/io/microsphere/spring/cloud/client/service/registry/autoconfigure/WebFluxServiceRegistryAutoConfigurationTest.java +++ b/microsphere-spring-cloud-commons/src/test/java/io/microsphere/spring/cloud/client/service/registry/autoconfigure/WebFluxServiceRegistryAutoConfigurationTest.java @@ -17,7 +17,6 @@ package io.microsphere.spring.cloud.client.service.registry.autoconfigure; -import io.microsphere.spring.webflux.annotation.EnableWebFluxExtension; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.test.context.TestPropertySource; @@ -33,7 +32,6 @@ "spring.main.web-application-type=reactive" } ) -@EnableWebFluxExtension @EnableAutoConfiguration class WebFluxServiceRegistryAutoConfigurationTest extends WebServiceRegistryAutoConfigurationTest { } \ No newline at end of file diff --git a/microsphere-spring-cloud-commons/src/test/java/io/microsphere/spring/cloud/client/service/registry/autoconfigure/WebMvcServiceRegistryAutoConfigurationTest.java b/microsphere-spring-cloud-commons/src/test/java/io/microsphere/spring/cloud/client/service/registry/autoconfigure/WebMvcServiceRegistryAutoConfigurationTest.java index cf751340..cf58a20a 100644 --- a/microsphere-spring-cloud-commons/src/test/java/io/microsphere/spring/cloud/client/service/registry/autoconfigure/WebMvcServiceRegistryAutoConfigurationTest.java +++ b/microsphere-spring-cloud-commons/src/test/java/io/microsphere/spring/cloud/client/service/registry/autoconfigure/WebMvcServiceRegistryAutoConfigurationTest.java @@ -16,7 +16,6 @@ */ package io.microsphere.spring.cloud.client.service.registry.autoconfigure; -import io.microsphere.spring.webmvc.annotation.EnableWebMvcExtension; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; /** @@ -25,7 +24,6 @@ * @author Mercy * @since 1.0.0 */ -@EnableWebMvcExtension @EnableAutoConfiguration class WebMvcServiceRegistryAutoConfigurationTest extends WebServiceRegistryAutoConfigurationTest { } \ No newline at end of file diff --git a/microsphere-spring-cloud-parent/pom.xml b/microsphere-spring-cloud-parent/pom.xml index c443dc43..8b7cf7b4 100644 --- a/microsphere-spring-cloud-parent/pom.xml +++ b/microsphere-spring-cloud-parent/pom.xml @@ -28,6 +28,7 @@ + org.junit From a94a82016c571304386d0c3428b58950e2007d99 Mon Sep 17 00:00:00 2001 From: Mercy Ma Date: Wed, 10 Jun 2026 10:08:11 +0800 Subject: [PATCH 5/5] Use name-based AutoConfigureAfter for web configs Replace direct class references to WebFluxAutoConfiguration and WebMvcAutoConfiguration in @AutoConfigureAfter with fully-qualified name strings to avoid a hard compile-time dependency and allow those auto-configurations to be optional. Removed the now-unused imports and preserved ordering relative to ServiceRegistryAutoConfiguration. --- .../WebFluxServiceRegistryAutoConfiguration.java | 4 ++-- .../autoconfigure/WebMvcServiceRegistryAutoConfiguration.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/service/registry/autoconfigure/WebFluxServiceRegistryAutoConfiguration.java b/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/service/registry/autoconfigure/WebFluxServiceRegistryAutoConfiguration.java index ffa2dcab..088b222b 100644 --- a/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/service/registry/autoconfigure/WebFluxServiceRegistryAutoConfiguration.java +++ b/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/service/registry/autoconfigure/WebFluxServiceRegistryAutoConfiguration.java @@ -16,7 +16,6 @@ */ package io.microsphere.spring.cloud.client.service.registry.autoconfigure; -import io.microsphere.spring.boot.webflux.autoconfigure.WebFluxAutoConfiguration; import io.microsphere.spring.boot.webflux.autoconfigure.condition.ConditionalOnWebFluxAvailable; import io.microsphere.spring.cloud.client.service.registry.condition.ConditionalOnAutoServiceRegistrationAvailable; import io.microsphere.spring.web.metadata.WebEndpointMapping; @@ -32,8 +31,9 @@ @ConditionalOnWebFluxAvailable @ConditionalOnAutoServiceRegistrationAvailable @AutoConfigureAfter(value = { - WebFluxAutoConfiguration.class, ServiceRegistryAutoConfiguration.class +}, name = { + "io.microsphere.spring.boot.webflux.autoconfigure.WebFluxAutoConfiguration" }) public class WebFluxServiceRegistryAutoConfiguration extends WebServiceRegistryAutoConfiguration { diff --git a/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/service/registry/autoconfigure/WebMvcServiceRegistryAutoConfiguration.java b/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/service/registry/autoconfigure/WebMvcServiceRegistryAutoConfiguration.java index a3cd328c..dd4021d7 100644 --- a/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/service/registry/autoconfigure/WebMvcServiceRegistryAutoConfiguration.java +++ b/microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/service/registry/autoconfigure/WebMvcServiceRegistryAutoConfiguration.java @@ -16,7 +16,6 @@ */ package io.microsphere.spring.cloud.client.service.registry.autoconfigure; -import io.microsphere.spring.boot.webmvc.autoconfigure.WebMvcAutoConfiguration; import io.microsphere.spring.boot.webmvc.autoconfigure.condition.ConditionalOnWebMvcAvailable; import io.microsphere.spring.cloud.client.service.registry.condition.ConditionalOnAutoServiceRegistrationAvailable; import io.microsphere.spring.web.metadata.WebEndpointMapping; @@ -46,8 +45,9 @@ @ConditionalOnWebMvcAvailable @ConditionalOnAutoServiceRegistrationAvailable @AutoConfigureAfter(value = { - WebMvcAutoConfiguration.class, ServiceRegistryAutoConfiguration.class +}, name = { + "io.microsphere.spring.boot.webmvc.autoconfigure.WebMvcAutoConfiguration" }) public class WebMvcServiceRegistryAutoConfiguration extends WebServiceRegistryAutoConfiguration {