From 100f80d0730b9f12ee7e0df25f3e753eddf25dc3 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 16 Feb 2022 11:50:51 +0100 Subject: [PATCH] Add @AutoConfiguration annotation This annotation can be used to mark auto-configurations with a dedicated annotation. Under the hood, it's a standard @Configuration with proxyBeanMethods set to false. Closes gh-29870 --- .../boot/autoconfigure/AutoConfiguration.java | 51 +++++++++++++++++++ .../developing-auto-configuration.adoc | 3 +- 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfiguration.java diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfiguration.java new file mode 100644 index 00000000000..a2053cd46ee --- /dev/null +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfiguration.java @@ -0,0 +1,51 @@ +/* + * Copyright 2012-2022 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. + * You may obtain a copy of the License at + * + * https://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 org.springframework.boot.autoconfigure; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Conditional; +import org.springframework.context.annotation.Configuration; + +/** + * Auto-configuration classes are regular Spring {@link Configuration @Configuration} + * beans. Generally auto-configuration beans are {@link Conditional @Conditional} beans + * (most often using {@link ConditionalOnClass @ConditionalOnClass} and + * {@link ConditionalOnMissingBean @ConditionalOnMissingBean} annotations). + * + * @author Moritz Halbritter + * @see EnableAutoConfiguration + * @see Conditional + * @see ConditionalOnClass + * @see ConditionalOnMissingBean + * @since 2.7.0 + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +@Configuration(proxyBeanMethods = false) +public @interface AutoConfiguration { + +} diff --git a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/features/developing-auto-configuration.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/features/developing-auto-configuration.adoc index c1d8f9da95f..b6c52e41404 100644 --- a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/features/developing-auto-configuration.adoc +++ b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/features/developing-auto-configuration.adoc @@ -12,7 +12,8 @@ TIP: A https://github.com/snicoll-demos/spring-boot-master-auto-configuration[de [[features.developing-auto-configuration.understanding-auto-configured-beans]] === Understanding Auto-configured Beans -Under the hood, auto-configuration is implemented with standard `@Configuration` classes. +Under the hood, auto-configuration is implemented with the `@AutoConfiguration` annotation. +This annotation itself is meta-annotated with `@Configuration`, making auto-configurations standard `@Configuration` classes. Additional `@Conditional` annotations are used to constrain when the auto-configuration should apply. Usually, auto-configuration classes use `@ConditionalOnClass` and `@ConditionalOnMissingBean` annotations. This ensures that auto-configuration applies only when relevant classes are found and when you have not declared your own `@Configuration`.