简单理解
spring中,我们配置一个bean有两种方式,一种是xml标签的形式,一种是通过java类的形式。那么自动装配就是通过java类的形式来配置bean。
不同的是,springboot将这些我们需要的bean提前配置好了以java类的形式存放在META-INF
目录下的spring.factories
里面,springboot通过启动类的注解@SpringBootApplication
扫描这些java类,将里面的@configuration
里面的这些bean注册到IOC容器里面,就完成了自动配置。
自动配置核心
启动类注解@SpringBootApplication
里面包含了三个重要的注解
@SpringBootConfiguration
,让springboot知道这是一个配置类,将进行对应的处理,比如将里面的bean注册到容器中@ComponentScan
,这是一个spring的注解,它定义扫描包路径往往是写死的,通过自动配置包注册器,可以动态的添加扫描路径@EnableAutoConfiguration
包含了两个注解@AutoConfigurationPackage
导入了一个自动配置包注册器,实现了两个功能- 扫描主启动类极其子包下的注解,比如
@Compent
、@Service
等,这些注解被它扫描到才能生效才能被注册进容器 - 有时候我们需要自定义一些配置会写一些
@Configuration
的类这些类被它扫描注册进容器是为了配合@Import AutoConfigurationImportSelector.class
和springboot中的选择机制使用的,注册了我们的这些自定义的配置类,那么自动配合的类就不会被注册
- 扫描主启动类极其子包下的注解,比如
@Import AutoConfigurationImportSelector.class
导入了一个自动配置选择器,当我们通过maven导入了依赖的时候,jar包中的META-INF/spring.factories
路径下会存在自动配置类,选择器就是通过某种条件判断是否需要导入这个路径下的自动配置类