SpringBoot自动配置

168 阅读2分钟

SpringBoot自动配置

是什么?

英文名称AutoConfiguration,是指在SpringBoot中引入依赖jar包后,SpringBoot自动对其进行配置,是SpringBoot中“开箱即用”的基础支撑。

源码分析

image.png

点击查看@SpringBootApplication,发现是个组合注解,其中

  • @SpringBootConfiguration表示是个配置类
  • @ComponentScan这个注解会自动注入所有在主程序所在包及子包下的组件
  • 自动配置的核心在于@EnableAutoConfiguration

点进去@EnableAutoConfiguration

image.png

先看@AutoConfigurationPackage

image.png

@import它的作用是提供了一种显式地从其他地方加载配置类的方式

而且支持三种导入的方式

  • 普通类
  • 接口ImportSelector的实现类
  • 接口ImportBeanDefinitionRegistrar的实现类

这里这个AutoConfigurationPackages.Registrar.class就是ImportBeanDefinitionRegistrar的实现类

点进去查看Registrar类

image.png

image.png 其中registerBeanDefinitions方法中,metadata是注解的元信息,registry是bean定义的注册器

  • 首先判断这个bean有没有被注册
  • 如果被注册了,走if条件,先获取bean定义,通过bean定义获取构造函数值,再给构造函数添加参数值
  • 否则走else条件,一个新的bean定义,设置beanClass为beanPackages类型,最后完成bean注册 总结:register方法主要是把注解所在的包下所有的组件都进行注册

再返回@Import(AutoConfigurationImportSelector.class)来看,点进去里面有个方法

image.png

image.png

整个流程下来主要是获得自动装配的实体,其中里面获得候选的配置类是核心方法,也就是getCandidateConfigurations,点进去看

image.png 这个方法主要是从工厂中获取自动配置类,这里直接调用SpringFactoriesLoader去加载对应的内容。然后有个断言,就是去org.springframework.boot.autoconfigure的META-INF/spring.factories下找自动配置类

image.png

image.png

可以看到这里面springboot给我们提供了很多自动配置类,随便找一个点进去看

image.png 其中

  • @ConditionalOnClass注解,这个注解其实是条件注解,表示存在某个类才实例化bean
  • @EnableConfigurationProperties使得@ConfigurationProperties 注解的类生效,这个类是配置RabbitProperties属性的类

总结:@EnableAutoConfiguration 给容器导入META-INF/spring.factories 里定义的自动配置类,筛选有效的自动配置类。每一个自动配置类结合对应的 xxxProperties.java 读取配置文件进行自动配置功能