SpringBoot之@SpringBootApplication底层理解

@SpringBootApplication底层理解

近期在学习SpringBoot,摸索了很久,结合几位老师的理解将自己对@SpringBootApplication的底层理解记录一下

1. @SpringBootApplication的作用

@SpringBootApplication来标注这是一个springboot的应用,被标注的类是一个主程序,运行SpringApplication.run(App.class, args)方法;传入的类App.class必须是被@SpringBootApplication标注的类。

这里有一个注意点,当@SpringBootApplication标注的类如果直接放在java包下是会爆红的(提示信息:Spring Boot Application in default package less… (Ctrl+F1) Inspection info),网上没有找到相关答案,按照我个人理解是因为@ComponentScan注解的原因,解决方法是将启动类放置到其他包下即可,比如新建com.***包。

2. @SpringBootApplication注解的结构

@SpringBootApplication注解除了四个元注解,还由另外三个注解

@SpringBootConfiguration//SpringBoot配置
@EnableAutoConfiguration//启动自动配置
@ComponentScan()//组件扫描

组成,三个注解顾名思义,各自功能非常明确(学好英语太重要了!!!),其中@SpringBootConfiguration声明这是一个SpringBoot配置类,@ComponentScan注解为扫描哪些包下组件,就不多做赘述,详细讲讲对@EnableAutoConfiguration注解进行学习。

3. @EnableAutoConfiguration注解

@EnableAutoConfiguration注解除四个元注解由下两个注解构成

@AutoConfigurationPackage//自动配置包
@Import({AutoConfigurationImportSelector.class})//

3.1 @AutoConfigurationPackage注解

@AutoConfigurationPackage负责保存标注相关注解的类的所在包路径。使用一个BasePackage类,保存这个路径;然后使用@Import注解将其注入到ioc容器中;这样,便可以在容器中拿到该路径。

3.2 @Import(AutoConfigurationImportSelector.class)注解

首先进入AutoConfigurationImportSelector找到selectImports方法
在这里插入图片描述


如上图,再进入getAutoConfigurationEntry方法,在这里我们可以发现最终返回了一个configurations,这个是获取到所有需要配置到文件的配置类,整个方法中也是不停在对此进行修改,然后我们再进入获取到这些配置类集合的方法getCandidateConfigurations进行查看

在这里插入图片描述


发现又要进入下一个方法(头晕子)
在这里插入图片描述
再进入下一个,发现加载了一个类加载器一个loadSpringFactories(工厂),点进去
在这里插入图片描述


可以发现classLoader.getResources(“META-INF/spring.factories”)方法,全局搜索这个类,发现了spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面META-INF/spring.factories
在这里插入图片描述


META-INF/spring.factories:SpringBoot已经将所有的组件都已经自动写好,启动时就会进入这个文件中去装配
在这里插入图片描述

总结一下

  • SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration

  • 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定

  • 生效的配置类就会给容器中装配很多组件

  • 只要容器中有这些组件,相当于这些功能就有了

  • 定制化配置

    • 用户直接自己@Bean替换底层的组件
    • 用户去看这个组件是获取的配置文件什么值就去修改。

xxxxxAutoConfiguration —> 组件 —> xxxxProperties里面拿值 ----> application.properties

由于时间关系还有表达能力可能不是非常好,简单总结了一下学习源码的过程,有不正之处也请大家多多指教!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值