什么是自动配置?
SpringBoot的自动配置就是当Spring容器启动后,一些配置类、bean对象就自动存入到了I0C容器中,不需要手动去new,简化了开发。
@Import注解作用
@Import 注解的作用是将指定的配置类或组件类导入到当前的 Spring 应用上下文中,从而将这些类中定义的 bean 注册到 IOC 容器中。
- 导入配置类:
- 可以将一个或多个
@Configuration配置类导入到当前上下文中。 - 导入后,这些配置类中定义的
@Bean方法会被执行,生成的 bean 会被注册到 IOC 容器中。
- 导入普通类:
- 可以导入普通的 Java 类(非
@Configuration类),Spring 会将这些类作为 bean 注册到容器中。
- 导入
ImportSelector实现类:
- 支持动态导入配置类或 bean 定义,适合需要根据条件动态加载配置的场景。
SpringBoot自动配置选择的是此种方式。
SpringBoot自动配置原理
从SpringBoot启动类入手分析,启动类被@SpringBootApplication注解修饰,它包含3个注解,分别是@SpringBootConfiguration、@ComponentScan、@EnableAutoConfiguration。
@SpringBootConfiguration:包装了@Configuration注解,标识启动类也是一个配置类。
@ComponentScan:组件扫描注解,默认扫描启动类所在包,及其子包下声明的Bean对象,并在项目启动时加载到SpringIOC容器当中。
@EnableAutoConfiguration:自动的配置核心注解。封装了@Import注解,@Import注解中导入了ImportSelector接口的实现类AutoConfigurationImportSelector配置类,其中 selectImports 则动态从META-INF/spring.factories(SpringBoot2.7.0之前的版本的配置文件)和
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports(SpringBoot2.7.0之后版本的配置文件)两个配置文件中,加载并过滤了需自动配置类的全类名到String数组当中,并加载到内存当中,项目启动时,调用run方法,通过反射创建Bean对象,并交给Spring IOC容器管理。
总结
自动配置的核心注解是@EnableAutoConfiguration,底层是一个@Import注解,会导入一个AutoConfigurationImportSelector这个配置类,会自动执行 selectImports 方法,最终会去调用 SpringFactoriesLoader.loadFactoryNames 方法,去扫描 META-INF/spring.factories 文件中名称为EnableAutoConfiguation对应的字符串列表,还有会扫描 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中所有信息,加载进内存封装成一个String数组,最后会根据各种条件【起步依赖、@Conditional相关注解】进行过滤,找到匹配条件的全类名,并封装成字符串数组到内存中。SpringBoot项目启动时,调用run方法,通过反射创建对象,并交给Spring容器管理。