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相关依赖

- 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放到容器中