SpringBoot学习总结

SpringBoot启动过程

阶段一:SpringApplication 构造
  1. 记录 BeanDefinition 源
  2. 推断应用类型
  3. 记录 ApplicationContext 初始化器
  4. 记录监听器
  5. 推断主启动类
阶段二:执行 run 方法
  1. 得到 SpringApplicationRunListeners,名字取得不好,实际是事件发布器
    • 发布 application starting 事件
  2. 封装启动 args
  3. 准备 Environment 添加命令行参数
  4. ConfigurationPropertySources 处理
    • 发布 application environment 已准备事件
  5. 通过 EnvironmentPostProcessorApplicationListener 进行 env 后处理
    • application.properties,由 StandardConfigDataLocationResolver 解析
    • spring.application.json
  6. 绑定 spring.main 到 SpringApplication 对象
  7. 打印 banner
  8. 创建容器
  9. 准备容器
    • 发布 application context 已初始化事件
  10. 加载 bean 定义
    • 发布 application prepared 事件
  11. refresh 容器
    • 发布 application started 事件
  12. 执行 runner
    • 发布 application running 事件
    • 这其中有异常,发布 application failed 事件

SpringBoot自动配置

  1. SpringBoot 的自动配置注解是 @EanbleAutoConfiguration
  2. SpringBoot 启动类上使用的 @SpringbootApplication,包含了@EanbleAutoConfiguration 注解,它又包含了@Import 注解,导入了一个类 AutoConfigurationImportSelector,该类中使用 SelectorImport 方法,这个方法扫描所有 jar 下的 spring.factories 中注册的各种 AutoConfiguration 类,满足 @Conditional 注解的条件,就实例化该 AutoConfiguration 类中定义的 Bean,并注入到Spring容器中
  3. 自动配置类本质上就是一个配置类而已,只是用 META-INF/spring.factories 管理,与应用配置类解耦
  4. @Enable 打头的注解本质是利用了 @Import
  5. @Import 配合 DeferredImportSelector 即可实现导入,selectImports 方法的返回值即为要导入的配置类名
  6. DeferredImportSelector 的导入会在最后执行,为的是让其它配置优先解析

@Indexed原理

  1. 在编译时就根据 @Indexed 生成 META-INF/spring.components 文件
  2. 扫描时
    • 如果发现 META-INF/spring.components 存在, 以它为准加载 bean definition
    • 否则, 会遍历包下所有 class 资源 (包括 jar 内的)
  3. 解决的问题,在编译期就找到 @Component 组件,节省运行期间扫描 @Component 的时间
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值