1.Spring Boot入门
1.1 Spring Boot 概述:
现在软件市场已经形成一定的规模,系统架构的复杂度也越来越高(例如有单体架构,分 布式架构,微服务架构)。软件的整个架构体系正在发生很大变化,在这种变化中,企业 现在更注重技术的开箱即用,更注重技术在生态圈中的深度融合,更注重轻量级的运维。 由此 spring boot 诞生。
1.2 Spring Boot 核心特性:
起步依赖(Starter Dependency)-项目创建时底层帮你关联依赖。
自动配置(Auto Configuration)。
健康检查(Actator)-监控。
其中,Spring Boot 官方地址为 https://spring.io/projects/spring-boot。
1.3 项目创建及结构分析
1.3.1 任何一个项目都有一个启动入口,在springboot中的启动类需要有@SpringBootApplication,注解进行描述,并且在类中会定义一个main方法
spring 框架这个(@SpringBootTest,@Component) 两个类的实例的创建由 Spring 负责,并且由 Spring 框架基于@Autowired 注解的描述完 成 DefaultCacheTests 实例中有关 DefaultCache 类型的值的注入(DI)。
通过对上面小节的学习,能说说 Spring 框架管理 Bean 对象有什么优势吗?(面试) Spring 是一个资源整合框架(Framework),通过 spring 可将很多资源(自己写的对象 或第三方提供的对象,例如连接池等)整合在一起,然后进行科学应用,以便更好的对外提 供服务。
能说说 Spring 框架管理 Bean 对象有什么优势吗?(面试)
Spring 是一个资源整合框架(Framework),通过 spring 可将很多资源(自己写的对象 或第三方提供的对象,例如连接池等)整合在一起,然后进行科学应用,以便更好的对外提 供服务。
思考:1) @Autowired 注解应用规则? 2) @Qualifier 注解的作用是什么? @Autowired 由 spring 框架定义,用于描述类中属性或相关方法(例如构造方法)。 Spring 框架在项目运行时假如发现由他管理的 Bean 对象中有使用@Autowired 注解描述 的属性或方法,可以按照指定规则为属性赋值(DI)。其基本规则是:首先要检测容器中是 否有与属性或方法参数类型相匹配的对象,假如有并且只有一个则直接注入。其次,假如 检测到有多个,还会按照@Autowired 描述的属性或方法参数名查找是否有名字匹配的对 象,有则直接注入,没有则抛出异常。最后,假如我们有明确要求,必须要注入类型为指 定类型,名字为指定名字的对象还可以使用@Qualifier 注解对其属性或参数进行描述(此 注解必须配合@Autowired 注解使用)。具体过程可参考图-18 的设计进行自行尝试和实 践。
▪ Spring boot 是什么? (框架,也可以看成是框架脚手架,做了架子工要做的事情-搭建 项目基础骨架的工作人员)
▪ Spring boot 核心优势?(启动依赖,自动配置-开箱即用,健康检查-系统监控)
▪ Spring boot 项目的创建方式?( https://start.spring.io)
▪ Spring boot 项目启动时,Bean 的初始化过程是怎样的?(查找,加载,读和存储配 置,创建和存储实例对象)
▪ Spring boot 项目启动时,Bean 对象的依赖注入过程是怎样的?(标记,查找,注入)
▪ Spring 框架中的 Bean 对象有什么特性?(延迟加载,作用域,生命周期方法)
▪ Spring 框架中单例(singleton)作用域对象特点,应用场景(频繁用)?
▪ Spring 框架中多例(prototype)作用域对象特点,应用场景(稀少用)?
▪ Maven 工具(项目构建工具)从哪里下载?(maven.apache.org)
▪ STS(集成了 spring 插件的 eclipse)工具从哪里下载?(spring.io/tools)
▪ STS 新版本怎么安装?(例如 STS4.5.0 的安装可使用:java -jar xxx.jar)
▪ 创建 spring starter 项目时 pom.xml 文件错误?(maven 私服,本地库,maven update,网络)
▪ Spring Boot 项目中支持的配置文件后缀有哪些?(.properties,.yml)
▪ SpringBoot 启动类的包扫描位置?(启动类所在包以及子包)
▪ SpringBoot 项目中可以有多个启动类吗?(不可以)
▪ 如何理解 Spring 框架?(资源整合框架,科学应用对象-资源,低耦合)
▪ Spring 管理 bean 对象时有什么优势?(为 bean 赋予了更加高级的特性,懒加载, 单例作用域,生命周期方法)
▪ Spring 框架中@Autowire 注解描述属性时,依赖注入的规则是怎样的?
▪ Spring 框架学习过程中学到了什么思想?(IOC,DI,池,低耦合,....)
▪ Spring 容器中 bean 名字不同,但类型相同的单例作用域配置可以有多个实例吗?
1)域名解析问题(与当地的域名服务器有关)
2)网络阻塞问题(带宽有限,单同时的请求数量比较多)
3)服务器线程有限(例如 tomcat 端线程数量配置的相对较少)
2.Spring Boot 整合连接池
2.1 概述
实际开发中应用程序与数据库交互时,“获得连接”或“释放资源”是非常消耗系统资源的 两个过程,为了解决此类性能问题,通常情况我们采用连接池技术来重用连接 Connection 对象
Java 为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己 的连接池实现这个接口。然后我们的应用程序中耦合与这个接口,便可以方便的切换不同 厂商的连接池,常见的连接池有 DBCP、C3P0,DRUID,HikariCP 等。
用户通过 DataSource 对象的 getConnection()方法,获取一个连接。 假如池中有连接,则直接将连接返回给用户。假如池中没有连接,则会调用 Dirver(驱 动,由数据库厂商进行实现)对象的 connect 方法从数据库获取,拿到连接以后,可以将 连接在池中放一份,然后将连接返回给调用方。
2.3 整合 HikariCP 连接池
HiKariCP 号称是目前世界上最快的连接池,有江湖一哥的称号,目前在 springboot 工程默认推荐使用 HiKariCP 连接池,现在我们创建一个新的项目,项目名 为 CGB-SBOOT-03,在此工程中整合 HiKariCP,其步骤如下:
第一步:添加依赖。
第二步:配置连接池
第三步:单元测试(测试包中编写)
第四步:原理分析
3. Spring Boot 整合 MyBatis 框架
3.1 概述
Mybatis 是一个优秀的持久层框架,底层基于 JDBC 实现与数据库的交互。并在 JDBC 操作的基础上做了封装和优化,它借助灵活的 SQL 定制,参数及结果集的映射方 式,更好的适应了当前互联网技术的发展。Mybatis 框架的简单应用架构,在当今的互联网应用中项目,mybatis 框架通常会由 spring 框架进行资源整合,作为 数据层技术实现数据交互操作。
3.2 业务进阶分析及实现
在 MyBatis 框架中定义 SQL 映射的方式有两种:一种是将 SQL 映射定义在我们的 xml 映射文件中,一种方式是借助注解将其声明在接口方法上。我们在实际项目中对于简 单的 SQL 映射可以直接以注解方式进行声明即可,复杂 SQL 还是要写到 xml 中,充分利 用动态 SQL 进行设计会更好一些。
4. Spring Boot 整合 SpringMVC 应用
4.1 概述
MVC(Model–view–controller)是软件工程中的一种软件架构模式,基于此模式把软件系 统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。目的是通 过这样的设计使程序结构更加简洁、直观,降低问题的复杂度。
其中各个组成部分的职 责为:
▪ 视图(View) - UI 设计人员进行图形界面设计,负责实现与用户交互。
▪ 控制器(Controller)- 负责获取请求,处理请求,响应结果。
▪ 模型(Model) - 实现业务逻辑,数据逻辑实现。
我们在软件设计时,通常要遵循一定的设计原则。MVC 架构模式的设计中,首先基于 单一职责原则(SRP-Single responsibility principle)让每个对象各司其职,各尽所能。然后 再基于“高内聚,低耦合”的设计思想实现相关层对象之间的交互。这样可以更好提高程序 的可维护性和可扩展性。
4.1 重难点分析
▪ 掌握基于 Spring boot 实现 HikariCP 连接池整合与测试应用的过程
▪ 掌握基于 Spring boot 实现 MyBatis 框架资源的整合与测试。
▪ 掌握基于 Spring boot 实现 Spring MVC 资源的整合与测试。
▪ 掌握 Mybatis 框架中的核心 API 以及应用关系
▪ 掌握 Spring MVC 中的核心 API 对象以及这些对象之间的调用关系。
▪ 了解基于连接池获取数据库连接的基本过程。
▪ 了解 HiKariCP 连接池常用 API 以及设计原理。
▪ 了解 thymeleaf 模板引擎的基本应用过程(基于官方文档可以查询使用)。
4.2 FAQ 分析
▪ Java 中连接池对象的标准 API 是什么?(DataSource)
▪ Java 中基于 DataSource 接口定义的连接池有哪些?(DBCP,C3P0,DRUID,HiKariCP,..)
▪ Java 中标准 JDBC API 中哪个对象负责与数据库建立连接?(Driver)
▪ Java 中连接池中的连接也是通过 Driver 对象获取的吗?
▪ SpringBoot 内置的连接池配置是什么?(HiKariCP)
▪ SpringBoot 连接数据库的配置没有问题,数据库连不上?(服务,驱动)
▪ SpringBoot 整合 MyBatis 时,为什么需要添加 mybatis 版本?
▪ @Mapper 注解的作用什么?(描述数据层接口,是由 mybatis 框架定义的规范)
▪ @Mapper 描述数据层接口时,底层会为接口做点什么?(创建实现类,创建实现类对 象,并将对象存储到 spring 容器-bean 池。)
▪ 框架底层基于@Mapper 描述的接口创建实现类对象,其内部做什么?
▪ SpringBoot 整合 mybatis 时候是否可以同时存在注解和 xml 的映射?
▪ SpringBoot 整合 mybatis 时如何实现 SQL 日志的输出?
▪ Spring MVC 核心组件对象有哪些?(DispatcherServlet,HandlerMapping,....)
▪ Spring MVC 核心组件中 DispatcherServlet 的作用什么?
▪ Spring MVC 应用中请求参数的映射过程?(直接量,pojo 对象)
▪ Spring MVC 应用的请求转发和重定向?(服务端跳转-转发,客户端跳转-重定向)
▪ Thymeleaf 是什么,应用场景,官网的地址?(thymeleaf.org)
▪ Thymeleaf 模板引擎中的标签属性如何使用?(查询官方 docs 文档)
▪ STS 工具常用快捷键(al+/,ctrl+shift+t,ctrl+t,ctrl+o,...)
▪ 断 点 操 作 时 f5 不 能 进 入 方 法 内 部 (https://blog.csdn.net/fly_sky333/article/details/79516566)
5 Spring Boot 综合应用分析
5.1 业务需求分析及设计
从数据库查询所有活动(Activity)信息,然后呈现在页面上(基于 thymeleaf,标签应用参 考官网 thymeleaf.org)。并可以基于其活动信息进行关操作。
对于软件开发人员在需求分 析时通常会有这样的过程:
第一:需求调研 (与软件使用人之间的一个沟通,了解其业务)
第二:需求分析 (对需求调研内容的总结和细化)
第三:原型设计 (是对需求分析结果的更好呈现)
第四:需求评审 (签字确认,确认边界,确定业务模块)
简历:参与了需求调研,需求分析,原型设计,需求评审。
职位:需求分析师(咨询师)
5.2 系统架构分析及设计
如何理解架构设计?(所有的架构设计必须以业务为前提,脱离业务谈架构就是耍流氓)
第一:架构模式?(CS/BS)
第二:单体架构,分布式架构,微服务架构?
第三:部署架构?(web 服务器一台,数据库服务器一台,…)
第四:系统整体分层架构?(基础设施,操作系统,中间件,应用软件,接入层)
第五:软件应用的分层架构?(表示层,请求响应控制逻辑层,业务处理逻辑层,数据操作逻 辑层,数据库)
职位:架构师(国内大部分架构还是要带头写代码-核心代码)
5.3 业务代码分析及设计
第一步骤:原型设计(省略)
第二步骤:数据库及表设计并初始化。(基于 source 指令去实现 )
第三步骤:应用架构设计(MVC)
第四步骤:业务设计,API 设计,时序设计?
第五步骤:POJO 对象,数据层对象,业务层对象,控制层对象,表示层。
6. 总结(Summary)
6.1 重难点分析
▪ 项目需求分析的基本过程(调研,分析,原型,评审)。
▪ 架构设计的基本过程(架构模式,架构类型,部署形式)。
▪ 代码实现的基本过程 (pojo,dao,service,controller)。
6.2 FAQ 分析
▪ SpringBoot 项 目 启 动 时 哪 些 自 动 配 置 生 效 了 , 如 何 查 看 ?( 配 置 文 件 中 定 义 debug=true)
▪ SpringBoot 项目默认支持热部署吗,什么时候使用热部署?(需要依赖)
▪ SpringBoot 项目中的热部署,会在哪些资源修改以后自动重启 tomcat?
▪ SpringBoot 项目中的健康检查(监控),可以检查哪些资源?
▪ SpringBoot 项目 lombok 插件安装以后,注解为什么不生效?
▪ Thymeleaf 模板引擎常用标签有哪些?(th:each,th:text,th:value,th:href,...)
▪ SpringBoot 项目实现过程中遇到过什么问题?(404,400,500,NPE,依赖注入,绑定异常,.)
Ajax 技术应用
1.1Ajax 是什么?
Ajax (Asynchronous JavaScript and XML) 是一种 Web 应用技术,可以借助客户端 脚本(javascript)与服务端应用进行异步通讯,获取服务端数据以后,可以进行局部刷新。进 而提高数据的响应和渲染速度。
1.2Ajax 技术应用场景?
Ajax 技术最大的优势就是底层异步,然后局部刷新,进而提高用户体验,这种技术现在 在很多项目中都有很好的应用,例如:
❏ 商品系统。
❏ 评价系统。 ❏ 地图系统。
❏ …..
AJAX 可以仅向服务器发送并取回必要的数据,并在客户端采用 JavaScript 处理来 自服务器的响应。这样在服务器和浏览器之间交换的数据大量减少,服务器响应的速度就 更快了。但 Ajax 技术也有劣势,最大劣势是不能直接进行跨域访问。
2.Ajax 技术在 Jquery 中应用
2.1Jquery 简介 jQuery 是一个快速、简洁的 JavaScript 框架,是一个优秀的 JavaScript 代码库 (或 JavaScript 框架)。jQuery 设计的宗旨是“write Less,Do More”,即倡导写更少的代 码,做更多的事情。它封装 JavaScript 常用的功能代码,提供一种简便的 JavaScript 设计 模式,优化 HTML 文档操作、事件处理、动画设计和 Ajax 交互。
2.2Jquery 中常用 Ajax 函数 jQuery 中基于标准的 ajax api 提供了丰富的 Ajax 函数应用,基于这些函数可以编 写少量代码,便可以快速实现 Ajax 操作。常用函数有:
❏ ajax(…)
❏ get(…)
❏ getJSON(…)
❏ post(…)
❏ …
说明:jquery 中 ajax 相关函数的语法可参考官网(jquery.com)
3.1 重难点分析
1. 客户端与服务端通讯时的请求响应模型?(同步,异步)
2. Ajax 编程的基本步骤(入口对象-XMLHttpRequest),Ajax 应用场景?
3. JQuery 框架中 ajax 函数的基本应用?(ajax(),get(),getJSON(...).....)
4. JS 代码编写过程中断点(debugger)的应用方式?
3.2FAQ 分析
1. Ajax 技术有什么优势,劣势?(优势:按需异步加载,局部更新,改善用户体验)
2. Ajax 技术中最核心对象?(XMLHttpRequest-入口对象)
3. 客户端 JS 问题如何调试?(打桩 console.log(),debugger,排除法)
4. 对于一些 js 框架你是如何学习?官网(,demo,实践-浏览器测试,搜索引擎)
注解:
@Component 是 Spring 中用于描述 Bean 类的一个注解。用于告诉 Spring 这个 类的实例由 Spring 创建,当此对象由 Spring 创建和管理时,默认会将对象存储到池 (Bean 池)中。
@SpringBootTest 注解用于告诉 spring 框架,此测试类交给 spring 管理。
@Autowired 注解描述属性时,用于告诉 spring 框架要为此属性注入一个值?(至 于注入规则,后面课程慢慢加强)
@Lazy 注解用于描述类,其目的是告诉 spring 框架此类支持延迟加载,通常会配合单 例作用域使用。
@Scope 是 Spring 中用于定义 Bean 对象作用域的一个注解,其常用的值有 singleton(整个内存有一份 Bean 实例,此实例何时创建与类的延迟加载特性配置有 关,此实例创建以后,生命周期会由 spring 框架管理),prototype(每次获取都会创 建新实例,此实例会在需要时创建与 lazy 特性无关,这个实例创建以后,不会交给 spring 管理,spring 可以对其初始化,但不负责销毁。)等。
@PostConstruct 注解用于描述 bean 对象生命周期方法中的初始化方法,此方法会 在对象的构造方法之后执行(是对象创建以后的初始化)。
@PreDestroy 注解用于描述 Bean 对象生命周期方法中的销毁方法,此方法会在对象 销毁之前执行(当作用域为 prototype 时,此方法不会执行)。
@Mapper 是由 MyBatis 框架中定义的一个描述数据层接口的的注解(所有的注解 只起到一个描述性的作用),用于告诉 Spring 框架此接口的实现由 mybatis 创建,并将其实 现类对象存储到 spring 容器.
Lombok 常用注解分析:
▪ @Setter 用于为描述的类生成 setter 方法,不包含 final 修饰属性。
▪ @Getter 用于为描述的类生成 getter 方法。
▪ @ToString 用于为描述的类添加 toString 方法。
▪ @EqualsAndHashCode 用于为描述的类,生成 hashCode 和 equals 方法。
▪ @NoArgsConstructor 用于为描述的类生成无参的构造方法。
▪ @AllArgsConstructor 用于为描述的类生成包含类中所有字段的构造方法。
▪ @Data 用于为描述的类生成 setter/getter、equals、canEqual、hashCode 、 toString 方法,如为 final 属性,则不会为该属性生成 setter 方法。
▪ @Slf4J 用于为描述的类添加一个日志属性对象
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。