首页 > 编程语言 > 详细

springboot自动配置原理分析

时间:2020-03-15 16:41:07      阅读:72      评论:0      收藏:0      [点我收藏+]

1、当SpringBoot应用启动的时候,就从主方法里面进行启动的。

技术分享图片

 

@SpringBootApplication

作用:标注在某个类上说明这个类是SpringBoot的主配置类 , SpringBoot就应该运行这个类的main方法来启动SpringBoot应用

 2.一般看起来简单的东西,原理一般都不简单,我们点进@SpringBootAppllication看看 

技术分享图片

 

 3.经过分析之后,我们发现三个核心注解

@ComponentScan(扫描器)

这个注解在Spring中很重要 ,它对应XML配置中的元素。

作用:自动扫描并加载符合条件的组件或者bean , 将这个bean定义加载到IOC容器中

@SpringBootConfiguration

作用:SpringBoot的配置类 ,标注在某个类上 , 表示这是一个SpringBoot的配置类;

我们继续进去这个注解查看

技术分享图片

发现一个Configration,在Spring中我们学过的一个东西。如果还不明白继续向下点,我们发现它最后由@Component注解管理,在spring中有着@Controller,@Service,@repository,@Component四大常用注解,意思是将类变为一个组件,好让扫描器扫描自Spring自动装配到容器中。

技术分享图片    

到这我们解决了装配的问题,还剩一个注解,那么它到底是怎么实现"自动"的呢,那我们看看@EnableAutoConfiguration这个注解。点进去。  

@EnableAutoConfiguration :开启自动配置功能

作用:以前我们需要自己配置的东西,而现在SpringBoot可以自动帮我们配置 ;@EnableAutoConfiguration告诉SpringBoot开启自动配置功能,这样自动配置才能生效;

技术分享图片

 

 

 点进去又发现两个注解,看来得好好分析一下,先说下

@AutoConfigurationPackage:自动配置包

技术分享图片

 

 

@import :Spring底层注解@import , 给容器中导入一个组件

Registrar.class 作用:将主启动类的所在包及包下面所有子包里面的所有组件扫描到Spring容器 ;

点进Registrar.class,找到,打好断点,运行程序

技术分享图片

 

  

new AutoConfigurationPackages.PackageImport(metadata)).getPackageName() 右击打开
技术分享图片
这样我们就能看他是代表我们com.pring下的总包

技术分享图片

 

 在返回去看刚刚的结论,你就能很轻松的明白了。回到上一个,我们还剩一个@Import({AutoConfigurationImportSelector.class}) :给容器导入组件 ;

区分一下,将我们的开发项目一个个变成bean注入到容器中,这个是我们在开发开始时导入的依赖变成bean将它注入到容器中。。。  个人理解而已,仅供参考

那么它是怎么获取到系统开发时所用的配置呢?点进去看。

技术分享图片

 

 我们发现一个List类型的变量。点进这个方法。

技术分享图片

 

 

技术分享图片

 

 我们发现它又调用了一个loadFactoryNames的方法。再点进去发现一个发现一个多次出现的文件:spring.factories,全局搜索它    Ctrl+f

技术分享图片

 

 

 

我们发现自动配置的spring.factories从我们Springboot版本包里面自动配置了一份到它的包下,里面有我们开发初期所用的依赖。

技术分享图片

 

 那是不是所有导进来的配置类都会生效?

答案是否定的,我们随便点进一个类去看,发现ConditionXXX这个注解,英文翻译就条件的意思,那么条件哪来呢,

spring-boot-starter 是pom.xml里面配置的启动器,向我们配完
spring-boot-starter-web时 他就会跟我们导入的配置类进行比较,是否导入web模块的依赖,不得不说是很精妙的设计

技术分享图片

 

 

所以,自动配置真正实现是从classpath中搜寻所有的META-INF/spring.factories配置文件 ,并将其中对应的 org.springframework.boot.autoconfigure. 包下的配置项,通过反射实例化为对应标注了 @Configuration的JavaConfig形式的IOC容器配置类 , 然后将这些都汇总成为一个实例并加载到IOC容器中。

结论:

  1. SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值

  2. 将这些值作为自动配置类导入容器 , 自动配置类就生效 , 帮我们进行自动配置工作;

  3. 整个J2EE的整体解决方案和自动配置都在springboot-autoconfigure的jar包中;

  4. 它会给容器中导入非常多的自动配置类 (xxxAutoConfiguration), 就是给容器中导入这个场景需要的所有组件 , 并配置好这些组件 ;

  5. 有了自动配置类 , 免去了我们手动编写配置注入功能组件等的工作;

       最后希望点进来的人都有收获,能理解springboot,如有错误请按照官方文档要求,仅做学习交流使用,再送你们一张简单的脑图

技术分享图片

 

 

 

   原文来自 公众号:狂神说 

    作者:狂神小忠粉

springboot自动配置原理分析

原文:https://www.cnblogs.com/420ITboy/p/12498044.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!