SpringBoot

1.1 springboot是什么?

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过 程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。Spring Boot致力于 在蓬勃发展的快速应用开发领域成为领导者。 2013年,Pivotal团队开始研发SpringBoot。 2014年4月,发布全新开源的轻量级框架的第一个SpringBoot版本。

官网地址: https://spring.io/

1.2为什么要学习SpringBoot?

SpringBoot是为了简化Spring应用的创建、运行、调试、部署等一系列问题而诞生的产物,自动装配的特性 让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖就可以轻易的 搭建出一个 WEB 工程未接触SpringBoot之前,搭建一个普通的WEB工程往往需要花费30分钟左右,如果遇到点奇葩的问题耽搁的 时间会更长一点,但自从用了SpringBoot后,真正体会到什么叫分分钟搭建一个WEB,让我拥有更多的时间 跟我的小伙伴们唠嗑了。使用SpringBoot后发现一切是如此的简单(还记得被JAR包,xml支配的恐惧吗,如 今都可以说 good bye)在传统的一些框架中(SSH、SSM、Servlet/JSP) 虽然功能很强大但是配置起来太麻烦了,相比python或者 php ,Java就略显臃肿,主要问题集中在两点:

1. 复杂的配置文件: 项目之间各种配置文件铺天盖地,在开发的过程中占用了大量的时间,并且需要做这些配置文件进行维护, 整个项目感觉特别复杂,并且Java代码和配置文件之间的切换开发,给程序人员带来很大的负担。

2. 各种依赖比较混乱: 主要问题就是版本冲突,不同技术的版本需要我们知道哪些版本存在冲突问题,一旦使用错误就需要重新再 去下载库进行依赖。 而Spring Boot简化了基于Spring的应用开发,只需要一个”run”就创建了一个独立的、生产级别的Spring应 用,Spring boot为Spring平台及第三方提供了开箱即用的设置(默认设置的包就是启动器starter),这样我们 就可以简单的开始。Spring Boot主张,用最少的配置做更多的事。如果我们创建一个Java应用,并使用java -jar启动,就能得到一个生产级别的web工程。

特点:

创建独立的 Spring 应用程序

直接嵌入Tomcat、Jetty或Undertow(无需部署WAR文件)

提供自以为是的“入门”依赖项以简化您的构建配置

尽可能自动配置 Spring 和 3rd 方库

提供生产就绪功能,例如指标、运行状况检查和外部化配置

完全不需要代码生成,也不需要 XML 配置

SpringBoot = Spring+SpringMVC

2.1查看SpringBoot默认提供的Bean

2.2手动注入bean

运行查看是否注入

控制层可以注解读取

2.3 自定义Banner

SpringBoot启动的时候我们可以看到如下内容,这一块其实是可以自定义的哦,而且在 2.X 版本中,它支持 的格式从文本扩展到**banner.txt、banner.jpg、banner.gif、banner.jpeg等等,只需要在resouces**目 录下添加指定命名的文件即可

3. YAML文件

在我们翻阅stater的过程中,也应该发现配置文件除了可是使用application*.properties类型,还可以使用后 缀为.yml或.yaml类型,这种类型相比properties类型支持了集合对象等数据,但是前提也必须是 application*才能被Spring扫描到。

YAML是"YAML Ain't a Markup Language"(YAML不是一种标记语言)的递归缩写。在开发的这种语 言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言),但为了强调这 种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。

3.1语法规则

1. 大小写敏感

2. 使用缩进表示层级关系

3. 缩进时不允许使用Tab键,只允许使用空格。

4. 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

5. 可以使用 "-小写字母" 或 "_小写字母"来 代替 "大写字母",如 userName 与 user-name ,user_name 含 义是一样的

6. key: value 格式书写 key 后面跟着冒号,再后面跟着一个空格,然后是值 

7. 注释使用#

3.2数据类型

YAML 支持的数据结构有三种

1. 普通的值(数字,字符串,布尔)

2. 对象、Map (属性和值) (键值对)

3. 数组 (List、Set)

测试代码

 读取配置文件

 关于直接获取数组类型

读取yml中配置的一个数组,通过@Vaule一直获取不到,通过一番资料的查询,才彻底清楚了@Vaule的使 用情况。

在Spring中读取配置文件的快捷方法常见的有两种,一个是通过@Vaule注解进行单一字段的注入,另外一种 方法就是通过@ConfigurationProperties注解来进行批量注入。

4.SpringBoot日志配置

Spring Boot内部采用的是Commons Logging进行日志记录,但在底层为**Java Util Logging+Log4J2、 Logback**等日志框架提供了默认配置 。

Java 虽然有很多可用的日志框架,但请不要担心,一般来说,使用 SpringBoot 默认的 Logback 就可以了。

4.1日志格式

输出如下元素:

Logback是没有FATAL级别的日志,它将被映射到ERROR

1. 时间日期:精确到毫秒,可以用于排序

2. 日志级别:ERROR、WARN、INFO、DEBUG、TRACE

3. 进程ID

4. 分隔符:采用---来标识日志开始部分

5. 线程名:方括号括起来

6. Logger名:通常使用源代码的类名

7. 日志内容:我们输出的消息

4.2日志输出

SpringBoot默认为我们输出的日志级别为INFO、WARN、ERROR,如需要输出更多日志的时候,可以通过 以下方式开启 命令模式配置: java -jar app.jar --debug=true , 这种命令会被SpringBoot解析,且优先级最高

资源文件配置:application.yml配置debug=true即可。该配置只对 嵌入式容器、Spring、Hibernate生效, 我们自己的项目想要输出DEBUG需要额外配置(配置规则:logging.level.=)

 4.3文件保存

默认情况下,SpringBoot仅将日志输出到控制台,不会写入到日志文件中去。如果除了控制台输出之外还想 写日志文件,则需要在application.properties设置logging.file或logging.path属性。

logging.file:将日志写入到指定的文件中,默认为相对路径,可以设置成绝对路径

logging.path:将名为spring.log写入到指定的文件夹中,如(/var/log)

日志文件在达到10MB时进行切割,产生一个新的日志文件(如:spring.1.log、spring.2.log),新的日志依 旧输出到spring.log中去,默认情况下会记录ERROR、WARN、INFO级别消息。

logging.file.max-size:限制日志文件大小

logging.file.max-history:限制日志保留天数

5.Thymeleaf模板

Thymeleaf是用来开发Web和独立环境项目的现代服务器端Java模板引擎。

Thymeleaf的主要目标是为您的开发工作流程带来优雅的自然模板 - HTML。可以在直接浏览器中正确显示, 并且可以作为静态原型,从而在开发团队中实现更强大的协作。

借助Spring Framework的模块,可以根据自己的喜好进行自由选择,可插拔功能组件,Thymeleaf是现代 HTML5 JVM Web开发的理想选择 - 尽管它可以做的更多。

Spring官方支持的服务的渲染模板中,并不包含jsp。而是Thymeleaf和Freemarker等,而Thymeleaf与 SpringMVC的视图技术,及SpringBoot的自动化配置集成非常完美,几乎没有任何成本,你只用关注 Thymeleaf的语法即可。

特点:

动静结合:Thymeleaf 在有网络和无网络的环境下皆可运行,即它可以让美工在浏览器查看页面的静态 效果,也可以让程序员在服务器查看带数据的动态页面效果。这是由于它支持 html 原型,然后在 html 标签里增加额外的属性来达到模板+数据的展示方式。浏览器解释 html 时会忽略未定义的标签属性, 所以 thymeleaf 的模板可以静态地运行;当有数据返回到页面时,Thymeleaf 标签会动态地替换掉静 态内容,使页面动态显示。

开箱即用:它提供标准和spring标准两种方言,可以直接套用模板实现JSTL、 OGNL表达式效果,避免 每天套模板、该jstl、改标签的困扰。同时开发人员也可以扩展和创建自定义的方言。

多方言支持:Thymeleaf 提供spring标准方言和一个与 SpringMVC 完美集成的可选模块,可以快速的 实现表单绑定、属性编辑器、国际化等功能。

·与SpringBoot完美整合,SpringBoot提供了Thymeleaf的默认配置,并且为Thymeleaf设置了视图解 析器,我们可以像以前操作jsp一样来操作Thymeleaf。代码几乎没有任何区别,就是在模板语法上有区 别。

5.1语法

Thymeleaf的主要作用是把model中的数据渲染到html中,因此其语法主要是如何解析model中的数据。从 以下方面来学习:

变量     方法   条件判断    循环   

运算:

逻辑运算

布尔运算

比较运算

条件运算

动静结合

指令:

Thymeleaf崇尚 自然模板 ,意思就是模板是纯正的html代码,脱离模板引擎,在纯静态环境也可以直接运 行。现在如果我们直接在html中编写 ${} 这样的表达式,显然在静态环境下就会出错,这不符合Thymeleaf 的理念。

Thymeleaf中所有的表达式都需要写在 指令 中,指令是HTML5中的自定义属性,在Thymeleaf中所有指令都 是以 th: 开头。因为表达式 ${user.name} 是写在自定义属性中,因此在静态环境下,表达式的内容会被当 做是普通字符串,浏览器会自动忽略这些指令,这样就不会报错了!

静态页面中, th 指令不被识别,但是浏览器也不会报错,把它当做一个普通属性处理。这样 span 的默 认值 请登录 就会展现在页面

如果是在Thymeleaf环境下, th 指令就会被识别和解析,而 th:text 的含义就是替换所在标签中的文 本内容,于是 user.name 的值就替代了 span 中默认的请登录

指令的设计,正是Thymeleaf的高明之处,也是它优于其它模板引擎的原因。动静结合的设计,使得无论是 前端开发人员还是后端开发人员可以完美契合。

5.2自定义变量

我们获取用户的所有信息,分别展示。 当数据量比较多的时候,频繁的写 user. 就会非常麻烦。 因此,Thymeleaf提供了自定义变量来解决:

示例:

首先在 h2 上 用 th:object="${user}" 获取user的值,并且保存 然后,在 h2 内部的任意元素上,可以通过 *{属性名} 的方式,来获取user中的属性,这样就省去了大量的 user. 前缀了

5.3方法

5.4字面值

有的时候,我们需要在指令中填写基本类型如:字符串、数值、布尔等,并不希望被Thymeleaf解析为变 量,这个时候称为字面值。

 字符串字面值 :使用一对 ' 引用的内容就是字符串字面值了

数字字面值:数字不需要任何特殊语法, 写的什么就是什么,而且可以直接进行算术运算

布尔字面值:布尔类型的字面值是true或false

5.5拼接

字符串字面值需要用 '' ,拼接起来非常麻烦,Thymeleaf对此进行了简化,使用一对 | 即可

5.6运算

算术

支持的算数运算符:+ - * / %

比较运算:

        三元运算:

三元运算符的三个部分:conditon?then:else

condition:条件

then:条件成立的结果

else:不成立的结果

其中的每一个部分都可以是Thymeleaf中的任意表达式。

默认值

有的时候,我们取一个值可能为空,这个时候需要做非空判断,可以使用 表达式 ?: 默认值 简 写

当前面的表达式值为null时,就会使用后面的默认值。 注意: ?: 之间没有空格。

5.7循环

循环也是非常频繁使用的需求,我们使用 th:each 指令来完成:

${users} 是要遍历的集合,可以是以下类型:

Iterable,实现了Iterable接口的类

Enumeration,枚举

Interator,迭代器

Map,遍历得到的是Map.Entry

Array,数组及其它一切符合数组结果的对象

在迭代的同时,我们也可以获取迭代的状态对象:

stat对象包含以下属性:

index,从0开始的角标

count,元素的个数,从1开始

size,总元素个数

current,当前遍历到的元素

even/odd,返回是否为奇偶,boolean值

first/last,返回是否为第一或最后,boolean值

5.8逻辑判断

有了 if和else ,我们能实现一切功能^_^。 Thymeleaf中使用 th:if 或者 th:unless ,两者的意思恰好相反。

如果表达式的值为true,则标签会渲染到页面,否则不进行渲染。

以下情况被认定为true:

表达式值为true

表达式值为非0数值

表达式值为非0字符

表达式值为字符串,但不是 "false" , "no" , "off"

表达式不是布尔、字符串、数字、字符中的任何一种

其它情况包括null都被认定为false

6.1代码生成器(旧)

依赖 mybatis plus 部分依赖

 代码生成器(旧)

...

代码生成器(新)

 

 配置文件

 Rest测试MP应用

 关于时间处理

旧版生成日期 java.util.Date

 新版生成日期 import java.time.LocalDateTime;

Java 8有一个全新的日期和时间API。 此API中最有用的类之一是LocalDateTime

 但是新版会出现JSON转化时间问题,因此我们添加一个配置类整体解决这个问题

 7.1SpringBoot自动配置原理

 SpringBoot 虽然干掉了 XML 但未做到 零配置,它体现出了一种 约定优于配置,也称作按约定编程,是一种 软件设计范式,旨在减少软件开发人员需做决定的数量,获得简单的好处,而又不失灵活性。 一般情况下默 认的配置足够满足日常开发所需,但在特殊的情况下,我们往往需要用到自定义属性配置、自定义文件配 置、多环境配置、外部命令引导等一系列功能。不用担心,这些 SpringBoot 都替我们考虑好了,我们只需 要遵循它的规则配置即可

Spring Boot的配置文件

初识Spring Boot时我们就知道,Spring Boot有一个全局配置文件:application.properties或 application.yml。

我们的各种属性都可以在这个文件中进行配置,最常配置的比如:server.port、logging.level.* 等等,然而 我们实际用到的往往只是很少的一部分,那么这些属性是否有据可依呢?答案当然是肯定的,这些属性都可 以在官方文档中查找到,但是开发这是比较喜欢记忆一些常用的配置,或者使用idea提供功能进行一些相关 的配置

自动配置生效原理

每一个XxxxAutoConfiguration自动配置类都是在某些条件之下才会生效的,这些条件的限制在Spring Boot 中以注解的形式体现,常见的条件注解有如下几项:

@ConditionalOnBean :当容器里有指定的bean的条件下。

@ConditionalOnMissingBean :当容器里不存在指定bean的条件下。

@ConditionalOnClass :当类路径下有指定类的条件下。

@ConditionalOnMissingClass :当类路径下不存在指定类的条件下。

@ConditionalOnProperty :指定的属性是否有指定的值,比如

@ConditionalOnProperties(prefix=”xxx.xxx”, value=”enable”, matchIfMissing=true) , 代表当xxx.xxx为enable时条件的布尔值为true,如果没有设置的情况下也为true

Spring Boot启动的时候类上有一个注解@SpringBootApplication,程序通过SpringApplication.run()将 本类的字节码传递到这个类中,从通过反射机制加载这个注解。 @SpringBootApplication是一个派生注 解,点击去发现 @EnableAutoConfiguration这就是开启自动配置的注解,通过这个注解找到@Improt 导入的注解找到 META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,而这些自 动配置类都是以AutoConfiguration结尾来命名的,它实际上就是一个JavaConfig形式的Spring容器配置 类,它能通过以Properties结尾命名的类中取得在全局配置文件中配置的属性如:server.port,而 XxxxProperties类是通过@ConfigurationProperties注解与全局配置文件中对应的属性进行绑定的,这 样就完成了一个自动配置功能。

7.2SpringBoot上传

文件上传和下载是JAVA WEB中常见的一种操作,文件上传主要是将文件通过IO流传输到服务器的某一个特 定的文件夹下;刚开始工作那会一个上传文件常常花费小半天的时间,繁琐的代码量以及XML配置让我是痛 不欲生;值得庆幸的是有了Spring Boot短短的几句代码就能实现文件上传与本地写入操作….

导入依赖

在 pom.xml 中添加上 spring-boot-starter-web 和 spring-boot-starter-thymeleaf 的依赖

配置文件

 默认情况下 Spring Boot 无需做任何配置也能实现文件上传的功能,但有可能因默认配置不符而导致文件 上传失败问题,所以了解相关配置信息更有助于我们对问题的定位和修复;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值