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 近程服务器下载的资源存储到的地位)
2)配置 maven 私服(配置到 mirrors 标签外部)。
3)配置 maven 中的 profile(配置到 profiles 标签外部), 设置 JDK 编译和运行版本。
2.3 STS 整合 maven 配置
1)启动 sts 进行 Maven Instalations
2)Maven User Settings 配置
3)我的项目工作区编码设置
2.4STS 工具应用根本优化
批改 STS 工具内存配置,关上 SpringToolSuite4.ini 文件,批改堆大小
3.Spring Boot 疾速入门
3.1 我的项目创立及构造剖析
在 STS 中创立 Spring Boot 我的项目:
3.2 我的项目启动过程剖析
SpringBoot 我的项目在启动时,首先基于启动入口类上的注解形容,进行主动配置并扫描指定包以及子包中的类进行加载,而后检测类上是否有 Spring 框架中指定的注解形容(例如 @Component,@Controller,@Service 等)。如果有,则将类交给 Spring 框架中的 BeanFactory 工厂接口的实现类对象,此工厂对象会基于反射创立 Bean 的实例,假如此 Bean 指定了生命周期办法,还会调用生命周期办法。当实例创立当前,Spring 框架还会基于类的作用域形容,将实例存储到不同作用域的容器中。以实现 Bean 对象的迷信利用。
3.3 我的项目业务初步实现及测试
业务实现:
基于 SpringBoot 脚手架(或者架子工),通过 Spring 框架进行 Bean 对象的治理实现。
第一步:创立一个 DefaultCache 类, 存储到 src/main/java 目录, 而后交给 spring 治理。
其中,@Component 是 Spring 中用于形容 Bean 类的一个注解。用于通知 Spring 这个类的实例由 Spring 创立,当此对象由 Spring 创立和治理时,默认会将对象存储到池(Bean 池)中。
第二步:增加 sringboot 测试类,进行 bean 的获取及测试,要放在 src/test/java 目录中:
其中:
@SpringBootTest 注解用于通知 spring 框架, 此测试类交给 spring 治理。
@Autowired 注解形容属性时,用于通知 spring 框架要为此属性注入一个值?(至于注入规定,前面课程缓缓增强)
第三步:代码设计及运行剖析
在图中形容了 DefaultCacheTests 类与 DefaultCache 类的关系,这两个类通过指定注解(@SpringBootTest,@Component)进行了形容,其用意是通知 spring 框架这个两个类的实例的创立由 Spring 负责,并且由 Spring 框架基于 @Autowired 注解的形容实现 DefaultCacheTests 实例中无关 DefaultCache 类型的值的注入(DI)。
第四步:为对象设计作用域,设置提早加载,设置生命周期办法(理解)。
在 Spring 框架中,Spring 为由它创立和治理的对象,设计了一些个性,例如作用域,提早加载,生命周期办法等,基于这些个性实现对 Bean 对象的治理。
其中:
@Lazy 注解用于形容类, 其目标是通知 spring 框架此类反对提早加载,通常会配合单例作用域应用。
@Scope 是 Spring 中用于定义 Bean 对象作用域的一个注解, 其罕用的值有
*singleton(整个内存有一份 Bean 实例, 此实例何时创立与类的提早加载个性配置无关,此实例创立当前,生命周期会由 spring 框架治理),
*prototype(每次获取都会创立新实例,此实例会在须要时创立与 lazy 个性无关,这个实例创立当前,不会交给 spring 治理,spring 能够对其初始化,但不负责销毁。) 等。
@PostConstruct 注解用于形容 bean 对象生命周期办法中的初始化办法,此办法会在对象的构造方法之后执行(是对象创立当前的初始化)。
@PreDestroy 注解用于形容 Bean 对象生命周期办法中的销毁办法,此办法会在对象销毁之前执行(当作用域为 prototype 时,此办法不会执行)。
第五步:通过测试类测试作用域,提早加载,生命周期办法
Spring 框架治理 Bean 对象有什么劣势!!!
*Spring 是一个资源整合框架(Framework), 通过 spring 可将很多资源 (本人写的对象或第三方提供的对象,例如连接池等) 整合在一起, 而后进行迷信利用,以便更好的对外提供服务。
* 在图中,Spring 框架能够为由它治理的对象(Bean)提供懒加载策略(对象临时用不到,则无需加载和实例化),作用域(例如 singleton- 频繁用时能够思考内存中只有一份,prototype- 应用次数少时能够用时创立,不必时销毁),生命周期办法(更好实现对象的初始化和资源销毁),以实现对象对系统资源的无效应用。同时 Spring 框架还能够基于用户设计治理对象与对象的依赖关系,以升高对象与对象之间的间接耦合,进步程序的可维护性和可扩展性。
3.4 我的项目业务加强实现及测试
第一步: 定义业务 Cache 接口
第二步: 定义 WeakCache 实现 Cache 接口.
第三步: 创立或批改 SoftCache, 让此类也实现 Cache 接口
第四步: 单元测试类
业务测试运行原理剖析
问题:
1)@Autowired 注解利用规定?
2)@Qualifier 注解的作用是什么?
@Autowired 由 spring 框架定义,用于形容类中属性或相干办法 (例如构造方法)。Spring 框架在我的项目运行时如果发现由他治理的 Bean 对象中有应用 @Autowired 注解形容的属性或办法,能够依照指定规定为属性赋值(DI)。
其根本规定是:首先要检测容器中是否有与属性或办法参数类型相匹配的对象,如果有并且只有一个则间接注入。其次,如果检测到有多个,还会依照 @Autowired 形容的属性或办法参数名查找是否有名字匹配的对象,有则间接注入,没有则抛出异样。最初,如果咱们有明确要求,必须要注入类型为指定类型,名字为指定名字的对象还能够应用 @Qualifier 注解对其属性或参数进行形容(此注解必须配合 @Autowired 注解应用)。
4.Spring Boot 大节总结
4.1 重难点剖析
- Spring boot 是什么? (框架, 也能够看成是框架脚手架,做了架子工要做的事件 - 搭建我的项目根底骨架的工作人员)
- Spring boot 外围劣势?(启动依赖, 主动配置 - 开箱即用, 健康检查 - 系统监控)
- Spring boot 我的项目的创立形式?(https://start.spring.io)
- Spring boot 我的项目启动时,Bean 的初始化过程是怎么的?(查找,加载,读和存储配置,创立和存储实例对象)
- Spring boot 我的项目启动时,Bean 对象的依赖注入过程是怎么的?(标记,查找,注入)
- Spring 框架中的 Bean 对象有什么个性?(提早加载,作用域,生命周期办法)
- Spring 框架中单例 (singleton) 作用域对象特点,利用场景(频繁用)?
- 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 文件配置谬误
问题剖析: 查看 maven 目录中的 settings.xml 的标签语法配置是否正确!
创立我的项目时网络连接超时
问题剖析:
1)域名解析问题 (与当地的域名服务器无关)
2) 网络阻塞问题 (带宽无限, 单同时的申请数量比拟多)
3) 服务器线程无限(例如 tomcat 端线程数量配置的绝对较少)
Maven 我的项目的 pom.xml 文件报错
问题剖析:
- 查看网络配置(是否网络畅通,不能手机网络)
- 检测 maven 配置是否正确(严格按文档配置执行)。
- 右键我的项目 maven update 强制更新。
- 更换 maven 私服仓库(选文档中的)
空指针异样(NullPointerException-NPE)
问题剖析:剖析谬误形容,找到本人写的类指定行号地位,看看哪个对象在进行办法调用,调用办法的对象有没有被赋值。
依赖注入失败
问题剖析:
- 查看错误代码中本人定义的类(例如 DefaultCacheTests)中的属
- 基于谬误剖析,哪个属性的值在进行依赖注入时失败了(例如 DefaultCache)
- 查看注入失败的属性对应的对象是否交给了 Spring 治理(例如是否有特定注解形容,包构造是否正确)。
找不到对应的 Bean 对象
问题剖析:
- 查看你获取的这个对象实例的类型是否应用了特定注解形容(如 @Component)
- 查看你获取的这个对象实例的类型所在的包是否正确(启动类包构造)
- 如果是基于 Bean 的名字进行 Bean 对象的获取,要检测 Bean 的名字是否正确。
依赖注入失败
问题剖析:
- 查看哪里对 Cache 进行了援用。
- 查看对 Cache 援用时应用的注解形容。
- 查看容器中 Cache 接口下实现类对象的定义(是否有多个?)。