首页 > 编程语言 > 详细

【SpringBoot】自动配置

时间:2021-01-22 19:26:13      阅读:42      评论:0      收藏:0      [点我收藏+]

【SpringBoot】自动配置

前言

Spring Boot和Spring Framework有啥区别?为什么我们要用Spring Boot?

对于我而言,刚刚接触spring这个概念的时候,就已经跳过了Spring Framework的阶段,直接跳入Spring Boot的黄金年代。这种以业务逻辑为核心,而不需要思考各种配置问题的编程方式早已经成为自然,以至于忘了为何我们项目用Spring Boot,而不用无包装过的Spring Framework。

总所周知,程序员是些很懒的人,能自动的就绝对不手动,能低耦合、高内聚的,就尽量往哪方向靠拢。在探讨Spring Boot和Spring Framework有啥区别问题之前,我们可以查看它们各自解决了什么问题。

1.Spring Framework解决了什么问题?

Spring Framework的核心是IOC/DI和AOP。

对于AOP而言,spring是封装了动态代理,然后形成各种方便的切面管理。这个没有spring也能用动态代理实现。对于IOC/DI,我觉得它才是Spring Framework最最核心的地方。

依赖注入或控制反转是Spring Framework最大的特性,当我们正确使用DI(依赖注入)或IoC时,可以开发出一个高内聚低耦合的应用程序,而这一一个低耦合的应用程序可以轻松的对其实施单元测试。这就是Spring Framework解决的最核心的问题。

2.而Spring Boot又解决了什么问题?

我们都知道,使用Spring Framework来开发应用程序,需要进行大量的配置工作以及依赖包的管理,工作繁重而且极易出现配置错误,尤为明显的是依赖包之间的版本冲突问题。

Spring Boot具有Spring Framework没有的能力

1.Spring Boot的自动化配置能力

2.Spring Boot Starter项目

3.开箱即用的依赖项管理机制

4.嵌入式服务器:Spring Boot已经内置了多个Web服务器,如Undertow,jetty,tomcat,因此我们不需要再额外的配置服务器,就可以完成应用程序的调试工作。

通过上述的梳理,我们可以看到,Spring Framework是一个提供了DI(依赖注入)和IoC(控制反转)的开发框架,使用Spring Framework可以帮助我们开发出高内聚,低耦合的应用程序,Spring MVC是在Spring Framework基础上发展出来的基于MVC模式的全功能Web开发框架,实现了Model,View和Controller之间的职责解耦;Spring Boot为我们提供了一个能够快速使用Spring Framework的优秀解决方案,通过最小化的配置,我们就可以使用Spring Framework,严格意义上讲,Spring Boot并不是某种框架,它只是为开发人员提供了一个更好的更方便的使用Spring Framework的解决方案。

自动获得配置类

这是一个SpringBoot的入口,但今天我们先不讨论SpringBoot的执行。我们先讨论SpringBoot的自动配置

技术分享图片

进入SpringBootApplication,常见的就只有下面红框选中的3个注解。

1.@SpringBootConfiguration:点进入发现底层是个@Configuration的注解,这里说明对于入口也可以用JavaConfig的形式进行配置。

2.@EnableAutoConfigutation:这个是自动配置的核心注解。稍后详解

3.@ComponentScan:这个是扫描该包下的所有Component,常见的有Controller,Service,Configuration。

技术分享图片

我们进入EnableAutoConfiguration接口。

个人感觉@EnableAutoConfiguration这个Annotation最为重要,所以放在最后来解读,大家是否还记得Spring框架提供的各种名字为@Enable开头的Annotation定义?比如@EnableScheduling、@EnableCaching、@EnableMBeanExport等,@EnableAutoConfiguration的理念和做事方式其实一脉相承,简单概括一下就是,借助@Import的支持,收集和注册特定场景相关的bean定义。

  • @EnableScheduling是通过@Import将Spring调度框架相关的bean定义都加载到IoC容器。
  • @EnableMBeanExport是通过@Import将JMX相关的bean定义加载到IoC容器。

同理,这个EnableAutoConfiguration是通过@import将配置信息的bean定义加载到IOC容器里。

技术分享图片

我们点进去,并来到AutoConfigurationImportSelector.getAutoConfigurationEntry

技术分享图片

我们的核心关注点应该是获得配置类名,因为获得相关的类名,才能进行相关操作。

技术分享图片

再次进入SpringFactoriesLoader.loadFactoryNames,从这个类名我们不难猜出它是有什么用——加载工厂类名。

loadFactoryNames包装了一层,实际起作用的是loadSpringFactories。

这里是扫描META-INF/spring.factories,然后获取所有org.springframework.boot.autoconfigure.EnableAutoConfiguration为key的所有value信息

技术分享图片

技术分享图片

至于怎么整出来,步骤比较复杂,有兴趣的可以自行了解。最后返回所有配置的实现类

技术分享图片

配置类到IOC的路径

上文我们说到它通过@EnableAutoConfiguration获得配置类的全类名的List

然后其通过ConfigurationClassParser->ConfigurationClassPostProcessor进行BeanDefinition的注册

技术分享图片

之后熟悉spring的同学就知道,然后注册BeanDefinition后,到调用getBean的时候就会进行实例化和依赖注入。

配合下图食用会更好~

技术分享图片

SpringBoot开箱即用的原理

选用一个例子来描述这整个过程。

在上面的代码可以看到自动配置器会根据传入的factoryClass.getName()到项目系统路径下所有的spring.factories文件中找到相应的key,从而加载里面的类。我们就选取这个mybatis-spring-boot-autoconfigure下的spring.factories文件

技术分享图片

进入org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration中,主要看一下类头:

技术分享图片

发现Spring的@Configuration,俨然是一个通过注解标注的springBean,继续向下看,

@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class})这个注解的意思是:当存在SqlSessionFactory.class, SqlSessionFactoryBean.class这两个类时才解析MybatisAutoConfiguration配置类,否则不解析这一个配置类,make sence,我们需要mybatis为我们返回会话对象,就必须有会话工厂相关类。

@CondtionalOnBean(DataSource.class):只有处理已经被声明为bean的dataSource。

@ConditionalOnMissingBean(MapperFactoryBean.class)这个注解的意思是如果容器中不存在name指定的bean则创建bean注入,否则不执行(该类源码较长,篇幅限制不全粘贴)

以上配置可以保证sqlSessionFactory、sqlSessionTemplate、dataSource等mybatis所需的组件均可被自动配置,@Configuration注解已经提供了Spring的上下文环境,所以以上组件的配置方式与Spring启动时通过mybatis.xml文件进行配置起到一个效果。通过分析我们可以发现,只要一个基于SpringBoot项目的类路径下存在SqlSessionFactory.class, SqlSessionFactoryBean.class,并且容器中已经注册了dataSourceBean,就可以触发自动化配置,意思说我们只要在maven的项目中加入了mybatis所需要的若干依赖,就可以触发自动配置,但引入mybatis原生依赖的话,每集成一个功能都要去修改其自动化配置类,那就得不到开箱即用的效果了。所以Spring-boot为我们提供了统一的starter可以直接配置好相关的类,触发自动配置所需的依赖(mybatis)如下:

技术分享图片

这里是截取的mybatis-spring-boot-starter的源码中pom.xml文件中所有依赖:

技术分享图片

因为maven依赖的传递性,我们只要依赖starter就可以依赖到所有需要自动配置的类,实现开箱即用的功能。也体现出Springboot简化了Spring框架带来的大量XML配置以及复杂的依赖管理,让开发人员可以更加关注业务逻辑的开发。

参考

https://www.cnblogs.com/xiaoxi/p/7999885.html

https://segmentfault.com/a/1190000018972356

【SpringBoot】自动配置

原文:https://www.cnblogs.com/zhoujianyi/p/14314073.html

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