@EnableAutoConfiguration 是 Spring Boot 的一个核心注解,它的作用是开启 Spring Application 的自动配置功能。
为什么 @EnableAutoConfiguration 通常和 @Configuration 配合使用?
因为@Configuration 用于指示一个类声明了一个或多个 @Bean 方法,并且这些方法会由 Spring 容器来处理,以便生成并注册 Spring 应用上下文中的 bean 对象。
而 @EnableAutoConfiguration 会开启Spring 应用上下文的自动配置功能。自动配置功能正好可以尝试基于类路径和已有的 bean(@Configuration注册) 来配置 Spring 应用容器。
**有2种类通常需要加上这个注解
**
1.应用程序入口类:Spring Boot 应用程序的 main 入口类通常会标注 @SpringBootApplication。这个注解整合了 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 注解,为开发者提供了一种便捷的方式启动和配置 Spring 应用程序。
@SpringBootApplication
public class MyApp {
public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);
}
}
2.自定义自动配置库:当您创建一个 Spring Boot Starter 或自定义的自动配置库(模块化你的配置)时,可能会创建一个配置类,该类使用 @EnableAutoConfiguration 以供其他人包含在他们的应用程序中。
@Configuration
@EnableAutoConfiguration
public class CustomAutoConfig {
// ... beans and other configurations
}
如果在上述的类中没有使用@EnableAutoConfiguration,会有什么问题?
如果在上述的类中没有使用@EnableAutoConfiguration,则可能有以下问题
1.需要手动创建所有必要的配置:Spring Boot 提供了一系列默认配置,例如数据源、JPA 集成、安全设置、健康检查等。这些配置可以通过 @EnableAutoConfiguration 自动设置
2.依赖管理问题:Spring Boot 的起步依赖(starters)提供了一组相关的依赖,这组依赖会根据包含在项目中的类来自动配置。如果没有 @EnableAutoConfiguration,自动配置不会发生,这可能导致一些库没有得到恰当的配置。
3.组件缺失:Spring Boot 通过自动配置可以为您提前创建一些常用的 bean(例如 RestTemplate, EntityManagerFactory, DispatcherServlet 等)。如果没有开启自动配置,您可能会遇到 ApplicationContext 中缺少这些组件的错误。
4.不匹配的默认配置:Spring Boot 自动配置会根据您的环境提供合适的配置。例如,如果您正在构建一个 web 应用并且依赖 spring-boot-starter-web,那么默认的嵌入式 Servlet 容器(如 Tomcat)会被自动配置。如果没有自动配置,您需要手动设置这些。
5.条件性配置失效:许多自动配置类都依赖于条件性配置注解(如 @ConditionalOnClass, @ConditionalOnBean, @ConditionalOnProperty 等),这些注解决定了某些配置是否应该生效。不使用 @EnableAutoConfiguration 意味着这些基于条件的配置不会被执行。
通常来说,是不是整个应用应该只需要有一个 @EnableAutoConfiguration 就够了?
是的。 一般来说,在整个 Spring Boot 应用中,只需要在一个地方启用 @EnableAutoConfiguration 注解就够了,这通常是应用的主配置类或主启动类。这是因为启用自动配置是一个全局操作,它会触发 Spring Boot 的自动配置机制去尝试配置整个应用。
Spring Boot 项目中通常会有一个主启动类,这个类上使用了 @SpringBootApplication 注解,这个注解是一个组合注解,它包括了 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 注解。当你使用 @SpringBootApplication,你已经隐含地使用了 @EnableAutoConfiguration,因此不需要再显式添加
那为什么有的应用里,存在一些类再单独使用 @EnableAutoConfiguration 和 @Configuration?
在大多数 Spring Boot 应用场景中,你不需要在主启动类以外的地方使用 @EnableAutoConfiguration 注解,因为它通常由 @SpringBootApplication 注解隐含地提供,后者旨在被用作应用程序的主配置入口点。不过,在某些特殊场景下,你可能考虑在主启动类之外的其他地方使用 @EnableAutoConfiguration 注解:
1.模块化配置:如果你在构建一个大型应用,并且希望模块化配置,某些模块可能会带有它们自己的自动配置。在这种情况下,你可能会在特定的配置类中使用 @EnableAutoConfiguration,这些类不一定是主启动类。
2.条件性自动配置启用:如果在应用程序中有一些特定条件下才想启用自动配置,你可能会在特定条件满足时的配置类上使用 @EnableAutoConfiguration。
3.创建自定义 starter:当你创建自定义的 Spring Boot starter 库时,可以在库中的配置类上使用 @EnableAutoConfiguration。用户引用你的 starter 时,Spring Boot 会自动发现并加载这些配置。
在 DataSourceAutoConfiguration 使用@EnableAutoConfiguration注解,和在 spring.factories 里声明 org.springframework.boot.autoconfigure.EnableAutoConfiguration= com.autoconfig.DataSourceAutoConfiguration 作用相同吗?
不完全相同。
在 spring.factories 文件中引用 DataSourceAutoConfiguration 作为自动配置类和在 DataSourceAutoConfiguration 类上使用 @EnableAutoConfiguration 注解,它们在激活类作用方面看似相似,但实际上是用于不同场景和目的。
@EnableAutoConfiguration 注解用在你的应用级别,是代表这个注解是针对你自己的应用,以启用 Spring Boot 的自动配置特性。这并不意味着用 @EnableAutoConfiguration 标注的 DataSourceAutoConfiguration 类只能在你自己的应用中使用。实际上,如果其他应用引入了包含 DataSourceAutoConfiguration 的 jar 包,并且 DataSourceAutoConfiguration 在它们的应用程序中是通过某种方式被启用(例如,通过自己的自动配置、组件扫描或明确的配置),那么 DataSourceAutoConfiguration 中定义的 beans 也可以在调用方的 Spring 上下文中被注册和使用。
在该库或 Starter 包的 spring.factories 文件中声明 DataSourceAutoConfiguration,则可以让 DataSourceAutoConfiguration 成为其他应用程序能够自动使用的自动配置类