1.Spring Boot简介

1.1 Spring Boot概述

现在软件市场已经形成一定的规模,系统架构的复杂度也越来越高(例如有单体架构,分布式架构,微服务架构)。软件的整个架构体系正在发生很大变化,在这种变化中,企业现在更注重技术的开箱即用,更注重技术在生态圈中的深度融合,更注重轻量级的运维。由此spring boot诞生。

1.2 Spring Boot核心特性

Spring boot是一个脚手架,构建于Spring框架(Framework)基础之上,基于快速构建理念,提供了自动配置功能,可实现其开箱即用特性(创建完一个基本的项目以后,可零配置或者少量配置即可运行我们的项目),其核心主要有如下几个方面:
起步依赖(Starter Dependency)-项目创建时底层帮你关联依赖。
自动配置(Auto Configuration)。
健康检查(Actator)-监控。
其中,Spring Boot官方地址为https://spring.io/projects/spring-boot。

2.Spring Boot环境配置

2.1 准备工作

-工具下载
1)下载JDK1.8,并进行环境变量配置
2)下载最新maven(例如:apache-maven-3.6.3)网址http://maven.apache.org/
3)下载sts最新版,网址https://spring.io/tools

2.2 Maven基本配置

1)打开maven中的setting.xml文件,并对其如下选项进行配置。
配置maven本地库(从maven远程服务器下载的资源存储到的位置)
1.png

2)配置maven私服(配置到mirrors标签内部)。
2.png

3)配置maven中的profile(配置到profiles标签内部),设置JDK编译和运行版本。
3.png

2.3 STS整合maven配置

 1)启动sts进行Maven Instalations

2.1.png

 
 2)Maven User Settings配置

2.2.png

 
 3)项目工作区编码设置

2.3.png

2.4STS工具使用基本优化

2.4.png
2.5.png
2.6.png
修改STS工具内存配置,打开SpringToolSuite4.ini文件,修改堆大小
2.7.png

3.Spring Boot快速入门

3.1 项目创建及结构分析

在STS中创建Spring Boot项目:

01.png
02.png
03.png

3.2 项目启动过程分析

3.png
SpringBoot 项目在启动时,首先基于启动入口类上的注解描述,进行自动配置并扫描指定包以及子包中的类进行加载,然后检测类上是否有Spring框架中指定的注解描述(例如@Component,@Controller,@Service等)。假如有,则将类交给Spring框架中的BeanFactory工厂接口的实现类对象,此工厂对象会基于反射创建Bean的实例,假如此Bean指定了生命周期方法,还会调用生命周期方法。当实例创建以后,Spring框架还会基于类的作用域描述,将实例存储到不同作用域的容器中。以实现Bean对象的科学应用。

3.3 项目业务初步实现及测试

业务实现:
基于SpringBoot脚手架(或者架子工),通过Spring框架进行Bean对象的管理实现。

第一步:创建一个DefaultCache类,存储到src/main/java目录,然后交给spring管理。
3.1.png
其中,@Component是Spring中用于描述Bean类的一个注解。用于告诉Spring这个类的实例由Spring创建,当此对象由Spring创建和管理时,默认会将对象存储到池(Bean池)中。

第二步:添加sringboot 测试类,进行bean的获取及测试,要放在src/test/java目录中:
3.2.png
其中:
@SpringBootTest 注解用于告诉spring框架,此测试类交给spring管理。
@Autowired注解描述属性时,用于告诉spring框架要为此属性注入一个值?(至于注入规则,后面课程慢慢加强)

第三步:代码设计及运行分析
3.3.png
在图中描述了DefaultCacheTests类与DefaultCache类的关系,这两个类通过指定注解(@SpringBootTest,@Component)进行了描述,其意图是告诉spring框架这个两个类的实例的创建由Spring负责,并且由Spring框架基于@Autowired注解的描述完成DefaultCacheTests实例中有关DefaultCache类型的值的注入(DI)。

第四步:为对象设计作用域,设置延迟加载,设置生命周期方法(了解)。

在Spring框架中,Spring为由它创建和管理的对象,设计了一些特性,例如作用域,延迟加载,生命周期方法等,基于这些特性实现对Bean对象的管理。
3.png
其中:
@Lazy注解用于描述类,其目的是告诉spring框架此类支持延迟加载,通常会配合单例作用域使用。
@Scope 是Spring中用于定义Bean对象作用域的一个注解,其常用的值有
*singleton(整个内存有一份Bean实例,此实例何时创建与类的延迟加载特性配置有关,此实例创建以后,生命周期会由spring框架管理),
*prototype(每次获取都会创建新实例,此实例会在需要时创建与lazy特性无关,这个实例创建以后,不会交给spring管理,spring可以对其初始化,但不负责销毁。)等。

@PostConstruct 注解用于描述bean对象生命周期方法中的初始化方法,此方法会在对象的构造方法之后执行(是对象创建以后的初始化)。
@PreDestroy 注解用于描述Bean对象生命周期方法中的销毁方法,此方法会在对象销毁之前执行(当作用域为prototype时,此方法不会执行)。

第五步:通过测试类测试作用域,延迟加载,生命周期方法
3.1.png

Spring框架管理Bean对象有什么优势!!!
*Spring 是一个资源整合框架(Framework),通过spring可将很多资源(自己写的对象或第三方提供的对象,例如连接池等)整合在一起,然后进行科学应用,以便更好的对外提供服务。
3.2.png
*在图中,Spring框架可以为由它管理的对象(Bean)提供懒加载策略(对象暂时用不到,则无需加载和实例化),作用域(例如singleton-频繁用时可以考虑内存中只有一份,prototype-使用次数少时可以用时创建,不用时销毁),生命周期方法(更好实现对象的初始化和资源销毁),以实现对象对系统资源的有效使用。同时Spring框架还可以基于用户设计管理对象与对象的依赖关系,以降低对象与对象之间的直接耦合,提高程序的可维护性和可扩展性。

3.4 项目业务增强实现及测试

第一步:定义业务Cache接口
4.1.png
第二步:定义WeakCache实现Cache接口.
4.2.png
第三步:创建或修改SoftCache,让此类也实现Cache接口
4.3.png
第四步:单元测试类
4.4.png
业务测试运行原理分析
4.5.png

问题:
1)@Autowired注解应用规则?
2)@Qualifier注解的作用是什么?

@Autowired由spring框架定义,用于描述类中属性或相关方法(例如构造方法)。Spring框架在项目运行时假如发现由他管理的Bean对象中有使用@Autowired注解描述的属性或方法,可以按照指定规则为属性赋值(DI)。
其基本规则是:首先要检测容器中是否有与属性或方法参数类型相匹配的对象,假如有并且只有一个则直接注入。其次,假如检测到有多个,还会按照@Autowired描述的属性或方法参数名查找是否有名字匹配的对象,有则直接注入,没有则抛出异常。最后,假如我们有明确要求,必须要注入类型为指定类型,名字为指定名字的对象还可以使用@Qualifier注解对其属性或参数进行描述(此注解必须配合@Autowired注解使用)。

4.Spring Boot小节总结

4.1 重难点分析

  1. Spring boot 是什么? (框架,也可以看成是框架脚手架,做了架子工要做的事情-搭建项目基础骨架的工作人员)
  2. Spring boot 核心优势?(启动依赖,自动配置-开箱即用,健康检查-系统监控)
  3. Spring boot 项目的创建方式?( https://start.spring.io)
  4. Spring boot项目启动时,Bean的初始化过程是怎样的?(查找,加载,读和存储配置,创建和存储实例对象)
  5. Spring boot 项目启动时,Bean对象的依赖注入过程是怎样的?(标记,查找,注入)
  6. Spring 框架中的Bean对象有什么特性?(延迟加载,作用域,生命周期方法)
  7. Spring 框架中单例(singleton)作用域对象特点,应用场景(频繁用)?
  8. Spring 框架中多例(prototype)作用域对象特点,应用场景(稀少用)?

4.2 FAD分析

1.Maven工具(项目构建工具)从哪里下载?(maven.apache.org)

2.STS(集成了spring插件的eclipse)工具从哪里下载?(spring.io/tools)

3.STS新版本怎么安装?(例如STS4.5.0的安装可使用:java -jar xxx.jar)

4.创建spring starter 项目时pom.xml文件错误?(maven私服,本地库,maven update,网络)

5.Spring Boot项目中支持的配置文件后缀有哪些?(.properties,.yml)

6.SpringBoot 启动类的包扫描位置?(启动类所在包以及子包)

7.SpringBoot项目中可以有多个启动类吗?(不可以)

8.如何理解Spring框架?(资源整合框架,科学应用对象-资源,低耦合)

9.Spring管理bean对象时有什么优势?(为bean赋予了更加高级的特性,懒加载,单例作用域,生命周期方法)

10.Spring 框架中@Autowire注解描述属性时,依赖注入的规则是怎样的?

11.Spring 框架学习过程中学到了什么思想?(IOC,DI,池,低耦合,....)

12.Spring容器中bean名字不同,但类型相同的单例作用域配置可以有多个实例吗?

4.3 BUG分析

Maven项目的setting文件配置错误
4.1.png
问题分析:检查maven目录中的settings.xml的标签语法配置是否正确!

创建项目时网络连接超时
4.2.png
问题分析:
1)域名解析问题(与当地的域名服务器有关)
2)网络阻塞问题(带宽有限,单同时的请求数量比较多)
3)服务器线程有限(例如tomcat端线程数量配置的相对较少)

Maven项目的pom.xml文件报错
4.3.png
问题分析:

  1. 检查网络配置(是否网络畅通,不能手机网络)
  2. 检测maven配置是否正确(严格按文档配置执行)。
  3. 右键项目maven update 强制更新。
  4. 更换maven私服仓库(选文档中的)

空指针异常(NullPointerException-NPE)
4.4.png
问题分析:分析错误描述,找到自己写的类指定行号位置,看看哪个对象在进行方法调用,调用方法的对象有没有被赋值。

依赖注入失败
4.5.png
问题分析:

  1. 检查错误代码中自己定义的类(例如DefaultCacheTests)中的属
  2. 基于错误分析,哪个属性的值在进行依赖注入时失败了(例如DefaultCache)
  3. 检查注入失败的属性对应的对象是否交给了Spring管理(例如是否有特定注解描述,包结构是否正确)。

找不到对应的Bean对象
4.6.png
问题分析:

  1. 检查你获取的这个对象实例的类型是否使用了特定注解描述(如@Component)
  2. 检查你获取的这个对象实例的类型所在的包是否正确(启动类包结构)
  3. 假如是基于Bean的名字进行Bean对象的获取,要检测Bean的名字是否正确。

依赖注入失败
4.7.png
问题分析:

  1. 检查哪里对Cache进行了引用。
  2. 检查对Cache引用时使用的注解描述。
  3. 检查容器中Cache接口下实现类对象的定义(是否有多个?)。

钱桥蔡徐坤
1 声望0 粉丝