From 5e95ba84480a1982547a7252392a56c31b909bb3 Mon Sep 17 00:00:00 2001 From: Taeik Lim Date: Thu, 23 Feb 2023 23:13:00 +0900 Subject: [PATCH 1/2] Back off if a custom ApplicationAvailability bean is present See gh-34347 --- ...licationAvailabilityAutoConfiguration.java | 8 +++- ...ionAvailabilityAutoConfigurationTests.java | 45 +++++++++++++++++-- 2 files changed, 47 insertions(+), 6 deletions(-) rename spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/{kubernetes => availability}/ApplicationAvailabilityAutoConfigurationTests.java (50%) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/availability/ApplicationAvailabilityAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/availability/ApplicationAvailabilityAutoConfiguration.java index e9b8397d41..65775e1c58 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/availability/ApplicationAvailabilityAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/availability/ApplicationAvailabilityAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,8 @@ package org.springframework.boot.autoconfigure.availability; import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.availability.ApplicationAvailability; import org.springframework.boot.availability.ApplicationAvailabilityBean; import org.springframework.context.annotation.Bean; @@ -25,13 +27,15 @@ import org.springframework.context.annotation.Bean; * {@link ApplicationAvailabilityBean}. * * @author Brian Clozel + * @author Taeik Lim * @since 2.3.0 */ @AutoConfiguration public class ApplicationAvailabilityAutoConfiguration { @Bean - public ApplicationAvailabilityBean applicationAvailability() { + @ConditionalOnMissingBean(ApplicationAvailability.class) + public ApplicationAvailability applicationAvailability() { return new ApplicationAvailabilityBean(); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/kubernetes/ApplicationAvailabilityAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/availability/ApplicationAvailabilityAutoConfigurationTests.java similarity index 50% rename from spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/kubernetes/ApplicationAvailabilityAutoConfigurationTests.java rename to spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/availability/ApplicationAvailabilityAutoConfigurationTests.java index ec2aab1bed..a7adad0e18 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/kubernetes/ApplicationAvailabilityAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/availability/ApplicationAvailabilityAutoConfigurationTests.java @@ -14,14 +14,17 @@ * limitations under the License. */ -package org.springframework.boot.autoconfigure.kubernetes; +package org.springframework.boot.autoconfigure.availability; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; -import org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration; import org.springframework.boot.availability.ApplicationAvailability; +import org.springframework.boot.availability.AvailabilityChangeEvent; +import org.springframework.boot.availability.AvailabilityState; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; import static org.assertj.core.api.Assertions.assertThat; @@ -29,6 +32,7 @@ import static org.assertj.core.api.Assertions.assertThat; * Tests for {@link ApplicationAvailabilityAutoConfiguration} * * @author Brian Clozel + * @author Taeik Lim */ class ApplicationAvailabilityAutoConfigurationTests { @@ -36,8 +40,41 @@ class ApplicationAvailabilityAutoConfigurationTests { .withConfiguration(AutoConfigurations.of(ApplicationAvailabilityAutoConfiguration.class)); @Test - void providerIsPresent() { - this.contextRunner.run(((context) -> assertThat(context).hasSingleBean(ApplicationAvailability.class))); + void providerIsPresentWhenNotRegistered() { + this.contextRunner.run(((context) -> assertThat(context).hasSingleBean(ApplicationAvailability.class) + .hasBean("applicationAvailability"))); + } + + @Test + void providerIsPresentWithRegisteredOne() { + this.contextRunner.withUserConfiguration(ApplicationAvailabilityConfig.class) + .run(((context) -> assertThat(context).hasSingleBean(ApplicationAvailability.class) + .hasBean("customApplicationAvailability"))); + } + + @Configuration(proxyBeanMethods = false) + static class ApplicationAvailabilityConfig { + + @Bean + ApplicationAvailability customApplicationAvailability() { + return new ApplicationAvailability() { + @Override + public S getState(Class stateType, S defaultState) { + return null; + } + + @Override + public S getState(Class stateType) { + return null; + } + + @Override + public AvailabilityChangeEvent getLastChangeEvent(Class stateType) { + return null; + } + }; + } + } } From 1b832d82f8e55fead29b024f88fc96e201582461 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Wed, 19 Apr 2023 17:25:10 +0200 Subject: [PATCH 2/2] Polish "Back off if a custom ApplicationAvailability bean is present" See gh-34347 --- ...licationAvailabilityAutoConfiguration.java | 2 +- ...ionAvailabilityAutoConfigurationTests.java | 36 +++---------------- 2 files changed, 6 insertions(+), 32 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/availability/ApplicationAvailabilityAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/availability/ApplicationAvailabilityAutoConfiguration.java index 65775e1c58..769c5a3cc8 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/availability/ApplicationAvailabilityAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/availability/ApplicationAvailabilityAutoConfiguration.java @@ -34,7 +34,7 @@ import org.springframework.context.annotation.Bean; public class ApplicationAvailabilityAutoConfiguration { @Bean - @ConditionalOnMissingBean(ApplicationAvailability.class) + @ConditionalOnMissingBean public ApplicationAvailability applicationAvailability() { return new ApplicationAvailabilityBean(); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/availability/ApplicationAvailabilityAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/availability/ApplicationAvailabilityAutoConfigurationTests.java index a7adad0e18..225ce98f5e 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/availability/ApplicationAvailabilityAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/availability/ApplicationAvailabilityAutoConfigurationTests.java @@ -20,13 +20,10 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.availability.ApplicationAvailability; -import org.springframework.boot.availability.AvailabilityChangeEvent; -import org.springframework.boot.availability.AvailabilityState; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; /** * Tests for {@link ApplicationAvailabilityAutoConfiguration} @@ -46,35 +43,12 @@ class ApplicationAvailabilityAutoConfigurationTests { } @Test - void providerIsPresentWithRegisteredOne() { - this.contextRunner.withUserConfiguration(ApplicationAvailabilityConfig.class) + void providerIsNotConfiguredWhenCustomOneIsPresent() { + this.contextRunner + .withBean("customApplicationAvailability", ApplicationAvailability.class, + () -> mock(ApplicationAvailability.class)) .run(((context) -> assertThat(context).hasSingleBean(ApplicationAvailability.class) .hasBean("customApplicationAvailability"))); } - @Configuration(proxyBeanMethods = false) - static class ApplicationAvailabilityConfig { - - @Bean - ApplicationAvailability customApplicationAvailability() { - return new ApplicationAvailability() { - @Override - public S getState(Class stateType, S defaultState) { - return null; - } - - @Override - public S getState(Class stateType) { - return null; - } - - @Override - public AvailabilityChangeEvent getLastChangeEvent(Class stateType) { - return null; - } - }; - } - - } - }