spring boot2 (一)spring简介,依赖管理和自动配置

二刷雷神的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

本篇笔记就记到这里,如果稍微帮到你了记得点个喜欢点个关注,也祝大家工作顺顺利利!生活健健康康!生命不息,学习不止!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容