@EnableAutoConfiguration注解

自动配置原理

Spring Boot的自动配置原理是它的核心特性之一,它极大地简化了Spring应用程序的配置。自动配置的目的是根据你项目中的jar依赖来尝试配置你的Spring应用。Spring Boot应用中的自动配置通过**@EnableAutoConfiguration注解来启用,该注解通常是通过@SpringBootApplication**间接使用的。

@SpringBootApplication注解中包含了@EnableAutoConfiguration:
SpringBootApplication的注解图
在@EnableAutoConfiguration注解中导入了AutoConfigurationImportSelector.class这个类,这个类的作用是收集和注册自动配置类。
在这里插入图片描述

自动配置原理:

  1. 启动类注解:在Spring Boot启动类上使用@SpringBootApplication,这是一个组合注解,它组合了@Configuration,@EnableAutoConfiguration,和@ComponentScan等注解。
  2. @EnableAutoConfiguration:这个注解是自动配置的关键,它导入了AutoConfigurationImportSelector类,这个类的作用是收集和注册自动配置类。
  3. 自动配置类的选择:AutoConfigurationImportSelector会读取META-INF/spring.factories文件,查找org.springframework.boot.autoconfigure.EnableAutoConfiguration键下指定的配置类。
  4. 条件化配置:自动配置类通常配备有条件注解,如@ConditionalOnClass,@ConditionalOnMissingBean,@ConditionalOnProperty等,这些注解决定了在特定条件满足时才激活相关配置。
  5. 配置类处理:每个自动配置类都会尝试配置一部分Spring应用。例如,如果类路径下有spring-webmvc,则相应的自动配置类会配置Spring MVC。
  6. @Conditional注解:这些注解允许配置在只有特定条件满足时才应用。例如,@ConditionalOnClass注解会检查类路径下是否存在某个类,而@ConditionalOnMissingBean会检查是否不存在某个类型的bean,只有在这样的条件满足时,相应的配置才会生效。
  7. 自动配置的顺序:自动配置类可以使用@AutoConfigureAfter或@AutoConfigureBefore注解来控制配置类之间的顺序。这确保了依赖关系可以得到正确的管理。
  8. 排除配置:如果你不想应用某些自动配置,可以使用@SpringBootApplication注解的exclude参数或者spring.autoconfigure.exclude属性来排除特定的自动配置类。

示例流程:

假设你正在创建一个web应用,并在项目中添加了spring-boot-starter-web依赖。

  1. 当应用启动时,@SpringBootApplication启用自动配置。
  2. @EnableAutoConfiguration选择AutoConfigurationImportSelector来处理。
  3. AutoConfigurationImportSelector读取spring.factories文件,加载所有列出的自动配置类。
  4. 自动配置类如WebMvcAutoConfiguration基于条件注解(比如检查是否在类路径中有嵌入式Tomcat,是否存在DispatcherServlet类等)来决定是否运行。
  5. 如果条件满足,WebMvcAutoConfiguration配置Spring MVC和嵌入式Tomcat。、

在Spring Boot中,META-INF/spring.factories 文件用于自动配置。org.springframework.boot.autoconfigure.EnableAutoConfiguration 键后面列出的类通常是标有 @Configuration 注解的类,这些类会被Spring Boot的自动配置系统实例化和处理。
但是,也有可能出现不带 @Configuration 注解的类在 spring.factories 文件中被列出的情况。在这种情况下,这些类可能是 @Component、@Service、@Repository 或 @Controller 等其他由Spring管理的组件,这些注解本身就包含了 @Component 元注解,意味着它们也会被作为Spring Beans注册到Spring容器中。
Spring Boot的自动配置机制并不严格要求这些类必须带有 @Configuration 注解。实际上,这些类只需要是被Spring识别的组件即可。当Spring Boot处理自动配置类时,它会查看类路径上的所有 META-INF/spring.factories 文件,并注册指定的类作为bean定义。
如果一个类在 spring.factories 文件中被指定,但它不带有 @Configuration、@Component 或其他相关注解,那么Spring Boot的自动配置机制会尝试将其作为一个普通的bean来处理。如果该类没有无参构造函数或包含其他不满足的依赖,那么在实例化过程中可能会抛出异常。
因此,如果你在 spring.factories 中包含了一个没有 @Configuration 或其他Spring组件注解的类,你需要确保Spring容器知道如何创建和管理这个类的实例。这通常意味着这个类应该至少有一个无参构造函数,并且不需要特殊的处理才能实例化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值