Spring Boot Starter 自动配置原理

Spring Boot Starter 自动配置原理

配置

  • 优先级 properties > yml > yaml
  • 命令行优先, java后
  • target目录下

Bean

获取bean

  • 获取 ioc 容器: 自动注入 ApplicationContext 对象

bean 作用域

  • @Lazy 标记bean 第一次使用时再初始化

  • @Scope(“prototype”)

第三方bean

@Configuration

标记配置类, 配置类中会声明 @Bean 对象, 加载到容器内;

SpringBoot 原理

  • 基于 springframework(;依赖配置繁琐)
  • 起步依赖, 自动配置

起步依赖

maven 的依赖传递

  • 0000.starter 就是起步依赖

自动配置

  • 声明的Bean 类自动存入ioc 容器内;

自动配置方法

导入普通类

导入 配置类

  • 配置类

  • 导入

导入 ImportSelector 实现类

  • selector 实现类

  • ImportSelector 实现类 重写方法 返回要加载的全类名数组即可

  • 这里是 config 配置类

  • 导入

Enable**** 注解

  • 自定义注解
  • selector
  • HeaderConfig
  • 添加注解即可

源码分析

  • EnableAutoConfiguration 注解封装了, import(selector)
  • selector 就要返回要加载的类, 这里返回的都是自动配置类, 里面声明了@Bean
  • 参考上面的 Enable****

conditionalOnMissingBean

  • 存在 指定类, 才加载

  • 没有这个bean 才加载

  • 判断配置文件中的key 和value, 有才加载

总结

starter 解读

  • 以 mybatis 为例

  • autoconfig 文件目录

  • MybatisAutoConfiguration

starter 中引入依赖 mybatis-spring-boot-autoconfigure

mybatis-spring-boot-autoconfigure 包中 spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 里面声明了自动配置类(自动配置类中声明了@Bean)

springboot -> @SpringBootApplication->@EnableAutoConfiguration->@Import({AutoConfigurationImportSelector.class})->selectImports()得到 spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 配置类后自动加载

@EnableConfigurationProperties

  • 在自动配置时, bean 对象的初始化参数可能是其他类(被@ConfigurationProperties注解标记的类) 这时需要在自动配置类上添加 @EnableConfigurationProperties({MybatisProperties.class})MybatisProperties 自动注入到容器中
  • 取值直接用Bean参数接受即可

自定义starter

实现

  • starter 中添加依赖
<dependency>  
    <groupId>com.aliyun.oss</groupId>  
    <artifactId>aliyun-springboot-autoconfigure</artifactId>  
    <version>0.0.1-SNAPSHOT</version>  
</dependency>
  • autoconfig 中添加aliyun相关依赖

https://www.bilibili.com/video/BV1m84y1w7Tb?spm_id_from=333.788.player.switch&vd_source=36d687ece6545eefcda2731026b8d90d&p=193

  • aliyunproperties 是自动获取参数的, 需要在自动配置类上天剑enable注解才不报错(@configurationProperties报错)
  • autoconfiguration 中
  • aliyunossutils 中是使用aliyunossproperties 连接oss 上传文件的逻辑

苍穹外卖

[9. 文件上传](Java/Java Web/苍穹外卖/苍穹外卖文件上传.md#文件上传)

如果设置成 starter

  • 新建包 starter 引用 autoconfiguration
  • autoconfiguration 中新建 java 文件 AliOssProperties, AliOssutils
  • AliOssProperties 负责将配置中的字段加载到容器中, 但是 AliOssProperties 类不加 @Component 注解(即使加了也不会扫描到), 因此这个类不会自动加载到容器中
  • AliOssUtils 通过 AliOssProperties 的参数创建连接上传文件
  • AliOssProperties 没有在容器中, 因此需要设置自动配置类(简单讲它负责从容器中拿到 properties 并实例化 Utils 并将 Utils 放到容器中, 在使用时只需注入即可 )
  • AliOssAutoConfiguration 负责从容器中获取 AliOssProperties 并实例化 AliOssUtils 放到容器中