From 6af88826c7df0b855909ecf996834d071449a20f Mon Sep 17 00:00:00 2001 From: Taeik Lim Date: Thu, 23 Feb 2023 23:13:00 +0900 Subject: [PATCH] Prevent autoconfigure of ApplicationAvailability when already registered Signed-off-by: Taeik Lim --- ...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 e9b8397d4198..65775e1c587e 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 @@ * {@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 ec2aab1bed2a..a7adad0e18e1 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 @@ * 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; + } + }; + } + } }