springboot2课程学习
- 课程特点
- 课程内容多,知识点杂乱,
- 课程面向业务需求大
- 课程定位:小白:完全没有用过springboot技术(目前阶段)
- 初学者:基于springboot进行ssm框架的整合,掌握第三方的技术与springboot整合版
- 积累springboot的实战开发的经验
- 课程模块:
- 基础篇
- 学习要求:
- 能够创建springboot工程
- 基于springboot实现ssm的框架的整合(springboot的目的本身就是为了简化开发而设计实用的)
- 学习要求:
- 实用篇
- 运维实用篇
- 学习要求
- 掌握springboot程序的多环境开发
- 基于linux系统发布springboot工程
- linux的课程学习提上进程
- 灵活配置springboot工程
- 学习要求
- 开发实用篇
- 基于springboot整合任意的第三方技术(redis、netty)
- 运维实用篇
- 原理篇(先学习完黑马——再转战雷神的原理)
- 基础篇
- 学习要求:(前置课程学习)
- java SE
- spring、springMVC
- mybatis和mybatis-plus(暂时未学)
- 数据库mysql(基础的增删改查语句)
- 服务器(javaweb servlet)
- maven (知道依赖服务、依赖传递、排除依赖、可选依赖、继承)
- web技术(还未学习)(明白vue是如何发送ajax请求,如何获得相应数据、如何进行数据模型的双向绑定)
- 实用篇的开发学习
- linux(centers 057)
- 熟系lunux基础指令、掌握linux系统的目录结构
- 实用开发技术
- 缓存redis、mongoDB
- 消息中间件roctketmq:rabbitMQ
- .........
- linux(centers 057)
- 原理的学习:
- 了解spring加载bean的各种方式
- 知道spring容器底层的工作原理,能够简单的读懂spring底层原码(相关的知识还需要扩展“设计模式”等方面的学习
springboot入门案例
- 使用目的
- 简化spring应用的初始搭建以及相应的开发过程
- 写起来快、方便
- 简化spring应用的初始搭建以及相应的开发过程
- 安装注意点
- 使用springboot的时候要求要在联网的环境下进行配置
- 在选择使用jdk的版本的时候,使用本机配置的jdk8(市面上通常情况下使用jdk8较为常见、也有使用jdk11的版本)
- 编写简单的打印语句(findById)打印相应的语句
- 在运行程序的时候,点击
即可以直接进行运行(无需要像springmvc 配置xml文件或者配置类),也无需像web一样进行启动服务器 ,即可以直接看到相应的配置文件
- 在运行程序的时候,点击
配置文件的相应信息
springboot在使用时候,无需要配置相应的类(pom中maven的坐标、web中的相应配置、spring、springmvc中的config类、xml等的配置类)等,在模块选定的时候勾选即可以一键式选定,使用者的唯一要求就是使用控制器进行相应的手工配置
springboot的程序运行Application程序的入口进入
- springboot的优点
- 缺点:
- 要求idea在使用过程中要确保联网,才能够加载到程序的框架
- 由于idea在联网时下载速度较慢,因此可以通过登入到spring.io官网进行手动配置,下载,通过idea将其加载进行,可以实现同idea的相同功能
- 下载好,安装到对象的包中,即可以直接进行使用打开
- 若国外的spring.io没有办法顺利的打开话,可以在设置模块中设置镜像,使用阿里云提供的组块用于使用(速度相对于国外的会更快一些)
- 遇到问题:当前在使用springboot创建相应的项目时,发现无法打开创建的项目
- 解决办法
- 根据我的项目结构进行相应的调整处理
application是在com.liu 包下,那么就是controller要求在其包层次的下个层,con.liu.controller
- 根据我的项目结构进行相应的调整处理
- 解决办法
要么将DemoApplication入口类的package改为com.lcf 要么将DemoController类的package改为com.lcf.demo.controller.
自己的失误:忘记配置getMapper
- 若计算机确实不能联网的话(涉密机构),需要怎么做
- 使用maven的继承机制,将相应的内容(jar包)
- 手动配置相应的属性(application)、引导类
总结:配置springboot的工程具有四种方式
- 基于idea自身创建的springboot工程
- 基于官网创建的springboot工程(比起idea下载速度要快)
- 基于阿里鱼创建的springboot工程(访问国内的网站速度要比国外的网站快)
- 手工创建maven工程,并将其修改成springboot工程(主要适用于不联网(涉密))
选择隐藏springboot工程中的其他的文件
适用file type的文件,将工程中多余的文件后缀进行相应的隐藏,使得界面更为干净整洁
springboot 入门案例解析
- 与原始的spring程序比较
- 传统的spring程序相比
- 依赖设置繁琐
- 使用springMVC,需要导入相应的jar
- 使用jdbc,则需要导入相应的jar包
- 配置繁琐
- 相应的properties 、xml、config等配置都省略,并且对于扫描文件、导入等相关配置
- 依赖设置繁琐
- springboot的程序优点
- 起步依赖(简化依赖配置)
- 自动配置(简化常用的工程相关配置 )
- 辅助功能(内置服务器。。。。。。)(最强功能)
- 具体实现上述优点
- parent
- dependenc y中引入的jar包相同,通过设置相同的模板,子类进行引用
- (对模板中的jar包的版本设置了相应的最优版本(maven 的属性) )
- project-parent:pom.xml (左边只进行相应的版本管理)
- 将所有的jar包都进行导入(好处:避免调包,由springboot进行设置)
- project -dependencies:pom.xml(右边只进行相应的坐标管理)
- 整合优化后的使用
- 定义一系列的常用坐标 :project -dependencies:pom.xml
- 定义一系列的常用坐标组合project -dependencies:pom.xml
- 直接进行使用
- 在创建的springboot的文件中,存在(pom.xml)文件
通过继承<parent>中的springboot-starter-parent</parent>进行文件版本的指定
继承与springboot-denpencies
- 在<properties>中定义了相关的属性
- <dependenciesmanagement中定义了相关的版本>(依赖管理)
- 在使用阿里云导入的包中,阿里直接将<dependencies>的相关内容直接进行导入(本质相同)(引入依赖的形式)
- 上面的版本(jar包)根据着springboot的版本号不同有所变化
- 好处:避免多个依赖使用相同的技术时出现依赖版本冲突
- project-parent:pom.xml (左边只进行相应的版本管理)
- starter(parent定义了想要的jar包的属性,而使用则是由starter进行调用)
- 前面(parent)定义了相应的版本号,在pom.xml文件中,使用者通过写入相应的jar的坐标,进行自动的导入
- starter(包含着若干个的坐标管理文件)(若一个starter中包含着其他的starter,则也有将其他的starter中内容进行导入并使用))
- 例子:做A技术进行开发,则只需要导入相应A技术的starter进行,而使用B技术进行开发,则相应的导入B技术的starter进行使用(starter中则自动帮助导入相应的配置)
- 总结:
- starter 定义了当前项目使用的所有依赖坐标,以达到减少依赖配合的目的
- parent 定义了若干个坐标版本号(依赖管理)以达到减少依赖冲突的目的
- 各个版本之间存在着不同的坐标版本
- 引导类(本质:以application结尾的类(在此上进行相应的启动))
- SpringApplication.run(Springboot0102QuickstartApplication.class, args)
- 无论是spring、springMVC 都是使用容器,将对象交付给容器进行相应的管理,
- run方法的本质:加载一个容器(加载bean)
- 验证:通过将其run方法生成对象,并且使用getBean方法获取对象并输出
- 引导类的核心功能:在注解(@SpringBootApplication)上体现
- 本质就是加载配置类:在springbootApplication中存在 springbootconfiguration的configuration
- 通过configuration中进行自动扫描(@componentScan)该注解的当前注释类所在包以及 下面的子包(以及是我们创建的controller类)的所有的注解,从而实现自动的加载容器
- 总结
- springboot的引导类是boot工程的执行入口,运行main方法就可以启动项目
- 运行后初始化spring的容器,扫描引导类所在包加载bean
- SpringApplication.run(Springboot0102QuickstartApplication.class, args)
- 内嵌tomcat(启动web服务器)
通过加载相应的<dependency>来进行相应的内置tomcat
- 调用内嵌的tomcat的核心(启动可以直接使用)(将服务器内置到程序中)
- 服务器的修改
- 在dependencies中导入相应的spring-Boot-starter-web的服务器坐标
- 核心本质是spring-Boot-starter-tomcat(默认)中的spring-Boot-ember-tomcat在起到核心作用
- 当选择进行修改相应的服务器类型,使用exclusions,将相应的坐标进行排除
- 导入相应的服务器的starter的坐标
添加jetty服务器
- 服务器的类型
- tomcat:Apache(应用面广、负责这若干较重组件)
- jetty:轻量级的服务器(若tomcat中的配置文件不需要使用,可以使用jetty的服务器)
- undertow:(负载性能勉强赢tomcat)
- 在dependencies中导入相应的spring-Boot-starter-web的服务器坐标
- 基本配置:(修改服务器上的相应的配置信息(修改服务器的端口、))
- 写哪
- 为了将相应的工程整合在一起,方便后面复习,将所有的工程整合在一起,因此使用复制工程
- 复制工程原则:保留工程的基础结构;抹掉原始工程的痕迹
- 总结:通过设置相应的模板,进行复制,从而避免后续要创建springboot工程的步骤(学习期间)
- 复制工程原则:保留工程的基础结构;抹掉原始工程的痕迹
- 配置端口号(在resource中的application.properties)中(key value)
- 端口配置:server:port = 80
- 在book中的配置文件是application.properties 可以在上面修改相关的任意属性
- 按照key value的属性值即可
- 修改别的配置
- 修改banner(修改)banner可以修改显示在控制台上的图标信息(off、console)
- 控制日志:
- logging。level .rootdebug (加载日志的debug的过程)
- logging.level.error(仅在出错时候才有相应的信息)
- logging.level.root = info 表示在初始时候的相应信息
- 具体的文档操作(查阅官方文档 )有具体信息的说明
- 核心:用什么技术就相应的开什么相应的配置
- springboot提供的属性配置的方式
- application.properties(key value ) 的相关属性配置
- application.yml(现代企业推荐使用这个格式)
- application.yaml
- 若三个配置文件同时出现,则properties为准,若只有yml和yaml共存时,则yml为准
- 不同配置文件中相同的配置加载顺序(properties>yml>yaml)不同配置文件中的不同配置全部保留
- 属性提示消失的解决办法
- 提示出现是因为springboot在idea的环境下的功能实现,若没有功能实现,表示其可能
- 格式
- 优点
- yaml的数据格式更容易阅读
- 与其他的脚本语言更容易 的进行交换
- 以数据为核心,重数据轻格式
- yaml文件扩展名
- 类型
- yml(主流)
-
- yaml
-
语法规则
-
-
数据前面要加空格与冒号隔开
-
- yml(主流)
-
yaml的数据读取方式
-
读取方式
-
读取单一属性的数据
-
先定义变量(不一定要与配置文件中的属性名相对应)
-
使用springboot中的注解
-
(@value(${"属性值"}))
-
-
若存在多级结构,则按照级别,使用·进行分格
-
(@value(${"类名.属性值"}))
-
-
若存在数据类型的,则使用数据名+索引(在数据中的编号)
-
(@value(${"类名[编号]"}))
-
-
-
读取引用类型的数据
-
使用${"属性名"}的方式进行引用数据
-
在yaml中支持转义字符,在使用时候需要使用""将其包裹起来
-
-
读取全部属性的数据
-
通过使用注解(自动转配)
-
使用environment对象来封装所有的配置信息
-
使用@Autowired自动装配数据到Enviromment对象中
-
-
-
-
- 类型
- 优点
- 为了将相应的工程整合在一起,方便后面复习,将所有的工程整合在一起,因此使用复制工程
- 写哪
- parent
- 传统的spring程序相比
-
使用springboot整合第三方的技术
- 要求
- 明确整合的技术(得到一个通用的结论以及步骤)
- 整合技术类型
- 整合JUnit
- 使用的注解(@SpringBootTest)测试类的注解
- springboot中的junit无需额外的操作整合,由创建的maven的本身就自带(maven本身的生命周期中就存在测试的环境,因此自带)(即导入测试对应的starter)
- 位置:位于创建的test类中的方法之上
- 作用:设置JUnit加载的springboot启动类上
- 图解
- 具体步骤
- 定义并注入所需要测试的对象
- 创建BookDao对象,并且采用自动注解的方法进行注入对象
- 执行测试方法
- 在 void contextLoads() {}通过调用对象.方法名,执行相应的测试方法
- 定义并注入所需要测试的对象
- 测试类的执行范围
- Test类中的结构与main包中的结构相对应,如果Test包中的springBootTest的测试范围是在引导类所在包及其下面的子包,如果超出相应的范围,则就会相应的进行报错
- 若确实由于业务需求导致Test的所在包与Main中不相同,通过设置classes属性,(springbootTest(classes =引导类 名.class)来进行相应的指定
- 本质原因是:如果没有在相对应的位置,则没有办法获取得到相应的spring的容器,因此需要通过输入类名.class,从而去进行相应的检索
- 整合MyBatis
- 前置(了解)mybatis在工作时需要连接那些相关的信息
- 核心配置:
- 映射配置:SQL映射(XML/注解)
- 前置(了解)mybatis在工作时需要连接那些相关的信息
- 整合MyBatis-plus
- 暂时还没学习(本章节跳过)
- 整合Druid
- 指定相应是数据类型
- 从maven中寻找相应的坐标,并且导入pom文件
- 在yml配置文件中指定相应的类型
- 两种方法
(通用性)
(推荐这种(整合性))
- 两种方法
- 总结:整合第三方通用技术
- 导入对应的starter文件
- 根据提供的配置各式,配置非默认值对象的配置项
- 从maven中寻找相应的坐标,并且导入pom文件
- 指定相应是数据类型
- 整合JUnit
- 要求
综合案例:基于springboot的SSMP的整合案例
- 实习的技术分析(只有简单的增删改查的相关操作)
- 先完成基础的CRUD功能并且进行测试
- 调通页面,确定异步提交成功后,制作相应的功能
- 添加分页功能与查询功能
- 流程
- 当前的项目架构
- 手机浏览器————前端服务器————后端服务器(微服务:在不同的服务器上进行相应的信息处理)
- 本次项目:
- 手机浏览器——服务器(前端、后端服务器合并在一起)
- 具体步骤(数据层的开发)
- 在创建模块中勾选springmvc(spring web)和数据库驱动 (MySQL driver)
- 修改配置文件的格式(properties 转变为yml)并且配置相应的参数(修改端口号:80)
- 根据数据库中的表,创建相应的实体类对象
- 使用lombok进行
- Lombok 一个java类库,提供了一组注解,能够简化pojo实体类的开发
- 步骤
- 先导入相应的Lombok的坐标
- Lombok中存在着许多的注解,通过下载插件可以查看Lombok中的相关消息(crtl+F12)进行查看
- @Data(封装了get、set、tostring、equal等相关的方法,但是没有构造器,因此需要手动进行配置)
- 步骤
- Lombok 一个java类库,提供了一组注解,能够简化pojo实体类的开发
- 使用传统的get、set方法
- 使用lombok进行
- 使用继承baseMapper来实现简化开发
- 开启MP运行日志
- 导入:使用BaseMapper进行开发时,在console端口只能看到相应的结果,缺不完看到其过程
- 日志:在配置文件中启动
- 开启:
mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
- 开启:
-
实现数据库分页
-
api
IPage page = new Page(1,5); bookDao.selectPage(page,null);
创建相应的ipage的对象,1表示起始的页面,5表示限制分页的数量
-
selectPage本身就是
-
设置相应的拦截器
-
public class MPconfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor(){ MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; } }
-
通过add方法新增相应的拦截器,完成相应的逻辑业务
-
本质就是实现动态拼写SQL语句来实现分页的功能,其写法是相对的固定
-
调试过程中需要开启相应的日志,才能够看到具体的信息
-
-
-
实现分页查询
-
本质:通过使用动态SQL的进行相应的数据层的查询
-
具体实现
-
使用queryWarpper进行查询
-
//创建querywrapper查询对象 QueryWrapper<Book> queryWrapper= new QueryWrapper<>(); //封装相应的查询条件 queryWrapper.like("name","Spring"); //(like方法中,第一个是数据库中的数据项,第二个是Spring中的搜索条件) //执行查询 bookDao.selectList(queryWrapper);
-
-
为避免查询错误,使用LamdaQueryWrapper可以避免查询时数据项输错(语法集出错(有着系统自动提示))
-
String name = "spring"; LambdaQueryWrapper<Book>lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.like(name != null,Book::getName,name); bookDao.selectList(lambdaQueryWrapper);
-
-
在使用的时候,一般是接受上面的封装对象,因此需要将结果进行非空判断,如果未进行非空判断,则会导致搜索以null为结果
-
-
- 当前的项目架构
业务层的开发(基础的CRUD)操作
- 业务层定义的接口:更加关注的是业务本身的逻辑
- login(String username ,String password)(业务层的接口)(注重功能的体现)
- selectByNameAndPassword(String username ,String password)(数据层的接口)(注重数据的相应功能(增删改查))
- 进行业务层调用数据层的相应操作
- 封装相应的对象
- 使用快速开发(模板)去简化重复的接口定义、调用
- 使用业务层提供的通用接口(Iservice<T>)以及与业务层通用实现类(ServiceImpl<M,T>)
- 具体的实现类:extend ServiceImpl<BookDao,Book>(相应的数据层的接口、数据的实体对象) Implement IBookService
- 对于常用方法,有提供相应的模板,可以直接进行调用
- 对于特定方法,如同正常的方法一样,直接进行定义,实现接口即可
- 对于重写的方法,通过使用@override进行相应的重写操作(方法名相同)
- 使用业务层提供的通用接口(Iservice<T>)以及与业务层通用实现类(ServiceImpl<M,T>)
表现层的开发
- 类型
- 基于Restful进行表现层的接口开发
- 返回的结果用json的形式进行返回
- 使用Postman测试表示层的接口功能
- 后端将相应的数据封装后,通过json将相应的结果返回,但是不同的操作返回的类型各不相同,因此需要将结果进行统一格式,方便前端进行数据表示
- 表现层的消息一致性处理
- 例如(增删改:(返回 true/false),查询单条记录(json),查询所有{json数组})
- 通过设计相应的数据类(用于前后端的数据格式统一(前后端数据协议))
- 表现层的消息一致性处理
- 基于Restful进行表现层的接口开发