参考: https://b23.tv/JFhubZ2
自动配置:springBoot自动去把第三方组件的bean装载到ioc容器里面,不需要开发人员再写bean相关的配置。
在启动类上加上@SpringBootApplication注解就可以实现自动配置。
举例
例如我们可以在pom文件中引入redis的starter依赖,在场景启动器starter里面含有要引用的配置包依赖。配置包中含有一个@Configuration的配置类,在这个配置类里定义了要注入ioc容器的bean对象。并且这个配置类的全路径会被放在spring.factories这个文件当中,springBoot可以通过spring.factories这个文件得知第三方jar包中这个配置类的位置。springBoot通过importSelecttor接口利用ClassLoader获取spring.factories,加载配置文件,实现对配置类的动态加载
所以我们在springBoot中只需要引用redis的依赖就可以直接使用RedisTemplate了。
原理
首先,我们先来梳理一遍springboot的启动流程
springboot启动流程
主类指的是被@SpringBootApplication标记的类,也称源配置类。
显然,配置类的bean的注入是在第三步,所以我们着重看第三步。
加载配置类
第二步:递归处理,将含有@Component或者Import的配置类中的bean注入到容器中。自动配置类的加载也在这一步
两个重要注解
@ComponentScan
作用是扫描被Component修饰的配置类,将被符合条件的类(例如被@Bean或者@Component标记)注入到容器中。
@Import
作用是将外部配置类导入到当前配置类中,从而使外部配置类的bean也能加载到容器中。
普通类
ImportSelector实现类
导入一连串配置类中的所有bean
例如下面就是把ZooConfig这个类放进ImportSelector这个类中,后面@Import到ImportSelector时会加进去ZooConfig,实际作用就是利用ImportSelector可以导入多个类。
ImportBeanDefinitionRegistrar
动态地导入符合条件的bean
自动配置
自动配置的基础是使用了@Import的选择器ImportSelector
原因如下:
@Component进行自动装配要输入第三方Jar包的每一个Package,
@Import导入普通类要记住导入的所有类名,更加不划算
@Import的ImportBeanDefinitionRegistrar是对@Bean方法的一种补充,不使用
@SpringBootApplication结构
内部包括三个注解,EnableAutoConfiguration负责自动装配,注入外部依赖的bean。内部实现了@Import的导入选择器AutoConfigurationImportSelector。
AutoConfigurationImportSelector
只需引入jar包,不用关心jar包的自动配置类,类名等信息。原理是使用ClassLoader读取所有jar包的META-IF/spring.factories,返回一个类名的集合,从中动态筛选出所需要的bean对象注入到容器中去。
AutoConfigurationImportSelector实现流程
@Conditional
SpringBootApplication流程
在启动后先创建ioc容器,然后注册源配置类,接着使用@Import和@ComponentScan加载所有符合条件的bean,自动装配在@EnableConfiguration里的@Import(AutoConfigurationImportSelector)里面加载jar包中配置类上的bean的。