自动配置原理
Spring Boot的自动配置原理是它的核心特性之一,它极大地简化了Spring应用程序的配置。自动配置的目的是根据你项目中的jar依赖来尝试配置你的Spring应用。Spring Boot应用中的自动配置通过**@EnableAutoConfiguration注解来启用,该注解通常是通过@SpringBootApplication**间接使用的。
@SpringBootApplication注解中包含了@EnableAutoConfiguration:
在@EnableAutoConfiguration注解中导入了AutoConfigurationImportSelector.class这个类,这个类的作用是收集和注册自动配置类。
自动配置原理:
- 启动类注解:在Spring Boot启动类上使用@SpringBootApplication,这是一个组合注解,它组合了@Configuration,@EnableAutoConfiguration,和@ComponentScan等注解。
- @EnableAutoConfiguration:这个注解是自动配置的关键,它导入了AutoConfigurationImportSelector类,这个类的作用是收集和注册自动配置类。
- 自动配置类的选择:AutoConfigurationImportSelector会读取META-INF/spring.factories文件,查找org.springframework.boot.autoconfigure.EnableAutoConfiguration键下指定的配置类。
- 条件化配置:自动配置类通常配备有条件注解,如@ConditionalOnClass,@ConditionalOnMissingBean,@ConditionalOnProperty等,这些注解决定了在特定条件满足时才激活相关配置。
- 配置类处理:每个自动配置类都会尝试配置一部分Spring应用。例如,如果类路径下有spring-webmvc,则相应的自动配置类会配置Spring MVC。
- @Conditional注解:这些注解允许配置在只有特定条件满足时才应用。例如,@ConditionalOnClass注解会检查类路径下是否存在某个类,而@ConditionalOnMissingBean会检查是否不存在某个类型的bean,只有在这样的条件满足时,相应的配置才会生效。
- 自动配置的顺序:自动配置类可以使用@AutoConfigureAfter或@AutoConfigureBefore注解来控制配置类之间的顺序。这确保了依赖关系可以得到正确的管理。
- 排除配置:如果你不想应用某些自动配置,可以使用@SpringBootApplication注解的exclude参数或者spring.autoconfigure.exclude属性来排除特定的自动配置类。
示例流程:
假设你正在创建一个web应用,并在项目中添加了spring-boot-starter-web依赖。
- 当应用启动时,@SpringBootApplication启用自动配置。
- @EnableAutoConfiguration选择AutoConfigurationImportSelector来处理。
- AutoConfigurationImportSelector读取spring.factories文件,加载所有列出的自动配置类。
- 自动配置类如WebMvcAutoConfiguration基于条件注解(比如检查是否在类路径中有嵌入式Tomcat,是否存在DispatcherServlet类等)来决定是否运行。
- 如果条件满足,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容器知道如何创建和管理这个类的实例。这通常意味着这个类应该至少有一个无参构造函数,并且不需要特殊的处理才能实例化。