二刷雷神的spring boot,区别是上一个是spring boot1.x版本的,这次是2.x版本的。
然后因为学过一遍了,所以可能这次我的整理会稍微的粗略了一点,之前详细说过的现在会稍微简略点,当然了遇到新的东西也会详细介绍。
先附上雷神的教学文档:https://www.yuque.com/atguigu/springboot
首先这里先大致的说一下spring。
spring最开始确实知识一个框架,但是随着延伸和发展,现在我们说的spring更像是一个生态圈。其不仅仅是spring框架,当然了现在直接用spring的也比较少,我们更习惯于用它的进阶版:spring boot,springboot相比于spring最大的特点就是自动配置,其也解决了spring需要的大量繁杂配置的情况。而spring5(spring boot2)相比于以前是很大的变化。其主要有两点原因:
- 而随着spring5的重大升级,引入了响应式编程的概念,所以现在的spring boot也主要分两块:传统的servlet还有就是响应式reactive。
- 因为java8底层的一些变化(函数可以有默认实现),使得之前架构上的很多模式(比如适配器模式)都发生了改变,所以spring的源码架构也发生了很大的变化。
spring boot的本质就是整合spring全家桶的一个框架。能快速创建出一个生产级别的spring应用。其主要优点:
- 创建独立的spring应用
- 内嵌web服务器
- 自动starter依赖,简化构建配置
- 自动配置spring以及第三方功能
- 提供生产级别的监控,健康检查以及外部化配置
- 无代码生成,无需编写xml
一句话总结:spring boot是整合spring技术栈的一站式框架,是简化spring技术栈的快速开发脚手架。
其缺点:
- 人称版本快,迭代快,需要时刻关注变化
- 封装太深,内部源码复杂,不容易精通
时代背景
在介绍spring boot时代背景的时候说了下几点:微服务,分布式,云原生。这里简单的总结一下。
微服务是一种架构风格
- 一个应用拆分为一组小型服务
- 每个服务运行在自己的进程内,也就是可独立部署和升级
- 服务之间使用轻量级http交互
- 服务围绕业务功能拆分
- 可以由全自动部署机制独立部署
- 去中心化,服务自治。服务可以使用不同的语言,不同的存储技术。
分布式的技术
- 远程调用
- 服务发现
- 负载均衡
- 服务容错
- 配置管理
- 服务监控
- 链路追踪
- 日志管理
- 任务调度
- ...
由于以上种种技术的实现,spring boot+spring cloud就可以解决。
云原生指原生应用如何上云,能够解决的问题:
- 服务自愈
- 弹性伸缩
- 服务隔离
- 自动化部署
- 灰度发布
- 流量治理
- ...
(貌似这些问题阿里云都可以解决,毕竟我不是专门的运维)
在以上这个背景下,spring boot应时代而生,SpringBoot其两大特点:依赖管理和自动配置。
依赖管理
spring boot的parent包中指定了大部分jar 的版本号。
如果对于它默认指定的版本有意见,也可以自定义修改版本,一般步骤:
1. 查看系统指定的版本号和标签名称
2. 在自己的pom文件中指定该标签名称的版本号
这里有一个概念:场景启动器。官方的场景启动器都是spring-boot-starter-xxx。只要引入starter,这个场景需要的常规依赖都会自动引入。
spring建议如果是三方的场景启动器,命名是xxx-spring-boot-starter。
所有场景启动器最底层的依赖就是spring-boot-starter
自动配置
这里要从spring boot的启动开始说起:
我们可以简单的看一下,springboot启动的那个run方法其实是有返回值的,返回的就是ioc容器。我们可以输出一下看看这个容器中都有什么组件。代码如下:
@SpringBootApplication
public class LsjApplication {
public static void main(String[] args) throws Exception{
//返回我们的ioc容器
ConfigurableApplicationContext context = SpringApplication.run(LsjApplication.class, args);
//查看一下容器里都有啥组件
String[] beans = context.getBeanDefinitionNames();
for(String s:beans) System.out.println("<<<<<<<"+s);
}
}
然后我们运行一下看看(注意引入的依赖越多容器中的组件越多,我这里只引入了web的场景启动器):
如上图,首先基本组件,自定义的组件都引入了。其次有一些必要而且常用的组件也都自动注入了,因为我引入了web的场景启动器,所以和其相关的一些tomcat,mvc,视图解析器啥的都自动配置注入了。
这个自动配置是如何实现的呢?就拿我只引用了web场景启动器为例:
- 自动配好Tomcat
- 引入Tomcat依赖(starter-web的依赖中web依赖里引入了tomcat)。
- 配置Tomcat
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>2.3.4.RELEASE</version>
<scope>compile</scope>
</dependency>
- 自动配好SpringMVC
- 引入SpringMVC全套组件
- 自动配好SpringMVC常用组件(功能)
- 自动配好Web常见功能,如:字符编码问题
- SpringBoot帮我们配置好了所有web开发的常见场景
- 默认的包结构
- 主程序所在包及其下面的所有子包里面的组件都会被默认扫描进来(这个源于默认的扫描包就是启动类所在的包)
- 无需以前的包扫描配置(正确使用的前提是启动类放在最外层)
- 想要改变扫描的包可以指定,如下在注解中手动指定包:@SpringBootApplication(scanBasePackages="lsj")
- 或者@ComponentScan 指定扫描路径
@SpringBootApplication(scanBasePackages="lsj")
等同于:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("lsj")
- 各种配置拥有默认值
- 默认配置最终都是映射到某个类上,如:MultipartProperties
- 配置文件的值最终会绑定每个类上,这个类会在容器中创建对象
- 按需加载所有自动配置项(一般这种bean会有条件才会生效,比如是否存在某bean,是否有某类等)
- 非常多的starter
- 引入了哪些场景这个场景的自动配置才会开启
- SpringBoot所有的自动配置功能都在 spring-boot-autoconfigure 包里面
至此这个自动配置算是从头到尾理了一遍。当然这里说的很简略,比如有些原本就不存在的生僻依赖就没办法有默认版本,还有自动配置这块spring-boot自动配置的东西虽然比较多但是也不见得那么全的,我们也可以自定义场景启动器实现自动注入。
因为我是刷过spring boot1再来刷这个的,感觉作为复习从头串一遍理解的更清楚了。其实这里很多细节就没说,比如跟代码走一遍看看为什么默认扫描启动类包下的所有类,还比如为什么那三个注解等同于启动类注解。这些都比较简单,自己翻代码就能看懂,而且自己翻出来的东西印象更深。
spring boot2中的第一节基础入门就到这里,反正笔记确实少记了很多东西。虽然boot1.x和2.x有很大的差别,但是其中很多基本理念和原理还是差不多的,这里重复的内容我很多没整理,建议如果觉得上面笔记太跳或者看的不清楚的可以去看看 boot1.x的笔记,下面是传送门:https://www.jianshu.com/p/8dbe22b329f4
本篇笔记就记到这里,如果稍微帮到你了记得点个喜欢点个关注,也祝大家工作顺顺利利!生活健健康康!生命不息,学习不止!