文章目录
Springboot的自动配置原理?
1. Spring Boot Starter 依赖
Spring Boot 提供了各种 starter 依赖,例如 spring-boot-starter-web、spring-boot-starter-data-jpa 等。引入这些 starter 依赖,会自动包含一系列相关的库和配置,从而简化了项目的依赖管理。
2.@SpringBootApplication注解
@SpringBootApplication
注解是一个组合注解,包括三个注解:
- @SpringBootConfiguration:标识该类是一个Spring配置类。
- @EnableAutoConfiguration:
启用Spring Boot的自动配置机制
。 - @ComponentScan:启用组件扫描,自动发现并注册Spring组件。
@SpringBootApplication
public class MySpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(MySpringBootApplication.class, args);
}
}
3.自动触发配置
@EnableAutoConfiguration 注解会触发自动配置机制
。Spring Boot 在启动时会根据类路径中的依赖和各种条件自动配置 Spring 应用。
@EnableAutoConfiguration 注解的定义:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
这个注解包含以下几个重要部分:
- @AutoConfigurationPackage:
自动配置包,标注此注解的类所在包及其子包会被扫描,自动注册为 Spring 的 Bean。
该注解的作用类似于 @ComponentScan。 @Import
(AutoConfigurationImportSelector.class):
导入 AutoConfigurationImportSelector(自动配置选择器),这个类负责加载并注册所有符合条件的自动配置类
。
4.Auto-configuration Classes
Spring Boot 通过扫描 META-INF/spring.factories
文件,查找 org.springframework.boot.autoconfigure.EnableAutoConfiguration 属性列出的所有自动配置类。这些自动配置类包含了一系列用 @Configuration 注解标注的类,这些类定义了应用所需的各种 bean。
# META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
...
5.条件注解
自动配置类通常使用条件注解
(如 @ConditionalOnClass、@ConditionalOnMissingBean、@ConditionalOnProperty 等)来决定是否加载特定的配置。这些注解确保了只有在满足特定条件时才会创建相关的 bean。
@Configuration
@ConditionalOnClass(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public DataSource dataSource(DataSourceProperties properties) {
return new HikariDataSource(properties);
}
}
eg:@ConditionalOnClass: 只有在特定的类存在时才会加载配置。
@ConditionalOnMissingBean: 只有在容器中没有特定的bean时才会加载配置。
@ConditionalOnProperty: 只有在配置文件中存在特定属性时才会加载配置。
6. 外部配置文件
外部配置文件
:Spring Boot 支持多种外部配置方式,如 application.properties 或 application.yml。这些配置文件可以覆盖默认的自动配置。例如,可以在 application.properties 文件中配置数据库连接信息:
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret
7. 优先级和排除
优先级和排除
:
- 优先级:Spring Boot 自动配置的 bean 定义在默认配置中具有较低优先级,允许用户自定义配置覆盖自动配置。
- 排除自动配置:可以使用 @SpringBootApplication 注解的 exclude 属性或 @EnableAutoConfiguration 注解的 exclude 属性排除不需要的自动配置类。
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MySpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(MySpringBootApplication.class, args);
}
}
总结
Spring Boot的自动配置原理
是通过@EnableAutoConfiguration注解引入自动配置逻辑,然后解析@Import注解,加载各种配置类,包括deferredlmportSelector和自动配置类。通过SPI机制读取spring.factories文件。过滤出自动配置类,并根据条件化配置来动态加载这些类,从而实现自动配置故功能。这种机制使得Spring Boot应用程序可以根据环境和需求自动配置,极大地简化了开发和部署的工作。
DeferredImportSelector 是 Spring Framework 中的一个接口,继承自ImportSelector,DeferredImportSelector 提供了一种机制,可以在所有配置类加载完成后,再根据某些条件动态决定需要导入哪些配置类。