## **SpringBoot的个人解读**

SpringBoot的个人解读

看了一段时间的SpringBoot源码,今天就来记录一下对SpringBoot的理解.

一、首先,说到SpringBoot大多数人都知道约定大于配置,那么什么是约定大于配置呢?

百度百科上面是这么解释的:

约定优于配置(convention over configuration),也称作按约定编程,是一种软件设计范式,旨在减少软件开发
人员需做决定的数量,获得简单的好处,而又不失灵活性。

当然学习知识那就得把它变成自己理解的,那么下面就是我的个人理解:

在Spring生态环境中,都是一步一步由繁到简的过程,从刚接触框架时的SSM,到现在的SpringBoot乃至于一站式
解决方案的SpringCloud全家桶框架等等…,都在遵循这个规律。
那么我们的SpringBoot就是在这样环境下生长出
来的,它将我们的业务开发和开发装配尽最大可能的分开,让我们的程序员能够尽心尽力的专注于业务开发,而不
必花大量的时间在搭建开发环境的配置文件上。

举个例子,一个大型的分布式项目,其中可能由20~50个不同的子model,如果我们仍旧按照以前的模式进行开
发,那么这么多model的相关配置文件的处理,就够架构师喝一壶的了,没有个半把个月是拿不下来的。很显然这
不是我们想要的,所以呢,SpringBoot的约定大于配置就很好的为我们解决了这一难点。
下面我们以IDEA开发工具SpringBoot2.2.6.RELEASE为例,来讲讲我们的约定大于配置的好处:
.以Web开发为例,在我们通过简单的几步点击之后(这里省略),IDEA就会给我们创建好一个具备Web环境的工
程。
那么,在这个工程中我们需要做什么才能Run起来,然后看到相应的浏览器输入呢?很简单,我们只需要写一
个简单的Controller,用@RestController和@RequestMapping相应的请求方式注解形式就可以给我们浏览器返回
Json数据。很显然我们就会发现,使用了SpringBoot后,我们再创建工程,就再也不用去编写什么
applicaContext.xml、springmvc.xml、mybatis-config.xml和web.xml…等等各种让大多数普通程序猿头疼的配
置文件,而是直接去编写我们的Controller层就可以在我们的浏览器立竿见影的看到效果,这仿佛是让我们后端的
开发人员立马变身成为前端开发人员的舒适错觉,只要简单的编写就可以立马看到效果。让我们告别了,曾经的那
个"一顿操作猛如虎,Run起Bug-15"的问号小朋友了,这样是不是很爽!
那么就会有人疑问,我们的原生的Spring去哪里了呢?
2.接下来我们的约定大于配置就要出场了,在SpringBoot框架中,我们的关键词就是自动装配
@EnableAutoConfiguration,在我们的SpingBoot工程中,程序的关键入口为@SpringBootApplication所注解的
工程类,会根据我们的POM文件的依赖来自动装配相应的组件以及组件中相应的配置,所有的配置完全由我们的
SpringBoot接管,由它来帮助我们完成相应环境的搭建以及整合处理…等等。也就是说,创建好工程的同时,我们
的默认配置就已经生效,在这个配置之上我们就可以进行简单的开发。
3.所以,我所理解的约定大于配置就是在没有规定配置的环境下,采用默认配置,以力求最简配置为核心思想,当
存在特殊需求的时候,自定义配置即可。这样可以大大的减少配置工作,这就是所谓的“约定”
SpringBoot中都有哪些约定?
1.Maven的目录结构。默认有resources文件夹,存放资源配置文件。src-main-resources,src-main-java。默认的编
译生成的类都在targe文件夹下面
2.Spring Boot默认的配置文件必须是,也只能是application.命名的yml文件或者properties文件,且唯一
3.application.yml中默认属性。数据库连接信息必须是以spring: datasource: 为前缀;多环境配置。该属性可以根
据运行环境自动读取不同的配置文件;端口号、请求路径等
二、我们来聊聊使用@SpringBootApplication注解后的工程类为什么就会自动装配了呢?
1.进入工程入口类,Ctrl+点击@SpringBootApplication我们就会看到一下信息:在这里插入图片描述

在这一堆注解中我们就可以看到我们熟悉的字样@EnableAutoConfiguration,那么这个注解都有什么作用呢?
(1)帮助SpringBoot应用将所有符合条件的 @Configuration 配置都加载到当前SpringBoot创建并使用的IoC容器
(控制反转)
(2)引入了AutoConfigurationImportSelector,其核心逻辑为selectImports方法:从配置文件METAINF/spring.factories加载所有可能用到的自动配置类;去重,并将exclude和excludeName属性携带的类排除;过
滤,根据POM文件中的Starter启动器来判断是否满足条件,然后将满足条件(@Conditional)的自动配置类返
回;
(3)允许 Spring Boot 自动配置注解,开启这个注解之后,Spring Boot 就能根据当前类路径下的包或者类来配置
Spring Bean。
在这些较为官方的解释中飘荡,可能会让小朋友又起了很多问号?
那么我用Spring的方式来模仿总结一下:
Spring:
在Spring中,我们的核心就是IOC容器,通常情况下,SSM项目中web.xml启动后加载Spring容器,Spring则会在
我们的applicationContext.xml中扫描所有的ID,将相应的Class配置到容器中,这样我们就可以通过依赖注入的方
式进行调用容器中相应类和组件的实例来完成相应的功能。
SpingBoot:
其实两者思想很相似,SpringBoot将所有可能用到的配置信息(可以理解为Spring中的ID)存放在METAINF/spring.factories中,当启用自动装配的时候,SpringBoot就会去扫描该路径下的所有xxxAutoConfiguration,
然后再通过我们的过滤器AutoConfigurationImportSelector来去重,排除,然后通过POM文件中的Starter启动器
来最终筛选出我们所需要的所有配置,然后再通过XXXPropertise.class类来加载我们所有需要的配置组件,最终完
成我们的所有配置。
另外,SpringBoot允许程序员添加或修改默认配置.
修改:就直接通过我们的.yml或者.properties文件来修改默认的配置信息即可.
添加:如果程序员添加自定义的组件,则必须继承相应的组件接口,然后编写组件内容后,用
@Configuration+@Bean的组合方式将该组件添加倒容器中(注意:!!!!千万不要添加@EnableXXX,否则
自定义组件无效);
为什么使用@EnableXXX注解后自定义组件则不会生效?
因为如上所说,@EnableXXX会扫描SpringBoot容器中的所有相应组件,然后对这些组件进行一系列的筛选,在这
其中就会有一个注解@ConditionalOnMissingClass就是判断容器中是否存在@EnableXXX所注解的类,如果存
在,则判断条件注解下面的代码就不会生效,很显然我们继承了SpringBoot的相应接口,当然人家也有自己的子
类,如果添加上@EnableXXX注解,会产生重复。因此,我们自定义的代码所依赖的SpringBoot内部代码就会失
效,也就导致我们自定义的组件会因此而失效,所以官方在相应的官网上都会告诉使用者添加自定义组件时千万不
要!添加相应的@EnableXXX!!!
添加完成后,当需要调用该自定义的组件时SpringBoot会去容器中寻找所有相应的组件,然后通过
@ConditionalOnXXX来进行条件的逐一判断,最终筛选出一个最优的组件提供给相应代码块使用
这里有没有人觉得很熟悉?对!其实SpringBoot使用这种扫描所有筛选最优的设计思想的很多,多看看源码就会
深刻感受到。
另外,在SpringBoot的设计中还有一种不同环境不同优先级的兼容互补思想(不详谈,有兴趣自己去了解),也是
很值得学习的 。
三、这一部分,来说说在上面提到的.yml和.properties配置文件
1.在SpringBoot中提供的全局配置文件必须是,也只能是application.命名,以.yml和.properties为后缀的配置文
件。
那么我们在这个配置文件中能配置什么呢?
(1)通过查看jar包,我们发现在org.springframework.boot.autoconfigure这个包中存放着我们所有可能用到的
配置类。
(2)在这些配置类中所定义的所有属性,SpringBoot默认会给他们赋一些值,那么这些配置类的默认配置值仅仅
只能满足较为简单的开发环境需求,如果我们想要在复杂的环境下开发,就可以在以上两种全局配置文件中对相应
属性的默认值进行修改
可能查看了org.springframework.boot.autoconfigure这个包的人就会说,这么多配置类,哪些配置类在我们
的环境中已经生效,并且还能被我们修改后相应的生效呢?
(3)我们可以在全局配置文件中设置debug=true,然后我们就可以在Run窗口中看到一堆数据,其中会有一个
CONDITIONS EVALUATION REPORT报告,这其中分为已生效(Positive matches:)和未生效(Negative
matches:)的配置类
(4)这样我们就可以查看已生效的配置类有没有我们所需要的,如果有我们就可以在全局配置文件中进行修改默
认值,如果没有可以去POM文件中导入相应的依赖,让相应的配置类生效,在进行以上操作;或者自己写一个配
置类亦可。
好了,以上为个人对SpringBoot的理解,可能写的不好希望看到的大佬帮我指出,万分感谢,让我们一起共同进步
一起成长。
生命不息,学习不止!待以后有更加深刻的理解再来分享,谢谢!

猜你喜欢

转载自blog.csdn.net/weixin_43562937/article/details/105921257