SpringBoot自动配置
是什么?
英文名称AutoConfiguration,是指在SpringBoot中引入依赖jar包后,SpringBoot自动对其进行配置,是SpringBoot中“开箱即用”的基础支撑。
源码分析
点击查看@SpringBootApplication,发现是个组合注解,其中
- @SpringBootConfiguration表示是个配置类
- @ComponentScan这个注解会自动注入所有在主程序所在包及子包下的组件
- 自动配置的核心在于@EnableAutoConfiguration
点进去@EnableAutoConfiguration
先看@AutoConfigurationPackage
@import它的作用是提供了一种显式地从其他地方加载配置类的方式
而且支持三种导入的方式
- 普通类
- 接口ImportSelector的实现类
- 接口ImportBeanDefinitionRegistrar的实现类
这里这个AutoConfigurationPackages.Registrar.class就是ImportBeanDefinitionRegistrar的实现类
点进去查看Registrar类
其中registerBeanDefinitions方法中,metadata是注解的元信息,registry是bean定义的注册器
- 首先判断这个bean有没有被注册
- 如果被注册了,走if条件,先获取bean定义,通过bean定义获取构造函数值,再给构造函数添加参数值
- 否则走else条件,一个新的bean定义,设置beanClass为beanPackages类型,最后完成bean注册 总结:register方法主要是把注解所在的包下所有的组件都进行注册
再返回@Import(AutoConfigurationImportSelector.class)来看,点进去里面有个方法
整个流程下来主要是获得自动装配的实体,其中里面获得候选的配置类是核心方法,也就是getCandidateConfigurations,点进去看
这个方法主要是从工厂中获取自动配置类,这里直接调用SpringFactoriesLoader去加载对应的内容。然后有个断言,就是去org.springframework.boot.autoconfigure的META-INF/spring.factories下找自动配置类
可以看到这里面springboot给我们提供了很多自动配置类,随便找一个点进去看
其中
- @ConditionalOnClass注解,这个注解其实是条件注解,表示存在某个类才实例化bean
- @EnableConfigurationProperties使得@ConfigurationProperties 注解的类生效,这个类是配置RabbitProperties属性的类
总结:@EnableAutoConfiguration 给容器导入META-INF/spring.factories 里定义的自动配置类,筛选有效的自动配置类。每一个自动配置类结合对应的 xxxProperties.java 读取配置文件进行自动配置功能