什么是SpringBoot
SpringBoot就是一个javaweb的开发框架,和SpringMVC类似,对比其他JavaWeb框架的好处,是简化开发,约定大于配置,几行代码开发一个http接口。
SpringBoot基于Spring开发,SpringBoot本身不提供Spring框架的核心特性以及扩展功能,只是用于快速、敏捷的开发新一代基于Spring的框架的应用程序。他并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具。SpringBoot约定大于配置的核心思想,默认帮我们进行了很多设置,多数SpringBoot应用只需要很少的Spring配置。同时集成了大量常用的第三方库配置(例如:Redis、MongoDB、Jpa、RabbitMQ、Quartz等等),SpringBoot应用中这些第三方库几乎可以零配置的开箱即用。
SpringBoot的主要优点:
- 为所有的Spring开发者更快的入门;
- 开箱即用;
- 内嵌式容器简化Web项目;
- 没有冗余代码生成和XML配置的要求。
什么是微服务
微服务
微服务是一种架构风格,它要求我们在开发应用的时候,这个应用必须构建成一系列小服务的组合;可以通过http的方式进行互通。
单体应用架构
所谓单体应用架构(all in one)是指,我们将一个应用的所有应用服务都封装在一个应用中。
无论是ERP、CRM或是其他系统,都把数据库访问,web访问,等各个功能放到一个war包内。
这样做的好处:易于开发和测试;也十分方便部署,当需要扩展时,只需要将war复制多份,然后放到多个服务器上,再做个负载均衡即可。
缺点是:哪怕我要修改一个非常小的地方,我都需要停掉整个服务,重新打包,部署这个应用war包。特别是对于一个大型应用,我们不可能把所有内容都放在一个应用内,如何维护、如何分工合作都是问题。
微服务架构
all in one 的架构方式,我们把所有的功能单元放在一个应用里面。然后我们把整个应用部署到服务器上。如果负载能力不行,我们将整个应用进行水平复制,进行扩展,然后再负载均衡。
所谓微服务架构,就是打破之前all in one 的架构方式,把每个功能元素独立出来。把独立出来的功能元素的动态组合,需要的功能元素才去拿来组合,需要多一些时间可以整合多个功能元素。所以微服务架构是对元素进行复制,而没有对整个应用进行复制。
这样做的好处:节省了调用资源;每个功能元素的服务都是一个可替换的、可独立升级的软件代码。
第一个SpringBoot程序
- jdk 1.8
- maven 3.6.1
- springboot:最新版
- IDEA
官方:提供了一个快速生成的网站!IDEA集成了这个网站。
- 可以在官网直接下载后,导入idea开发;
- 直接使用idea创建一个Springboot项目(一般开发直接在IDEA中创建)。
截图步骤:
原理初探
自动装配原理
pom.xml
- spring-boot-dependencies: 核心依赖在父工程中;
- 我们在写或者引入一些Springboot依赖时,不需要指定版本,就因为有这些版本仓库。
启动器
<!--启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
- 启动器:就是Springboot的启动场景;
- 比如Spring-boot-starter-web,会帮我们自动导入web环境所有的依赖。
- Springboot会将所有的功能场景,都变成一个个启动器。
- 我们要使用什么功能,只需要找到对应的启动器就可以 starter。
主程序
@SpringBootApplication // 标注这个类是一个springboot的应用
public class Springboot01HelloworldApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot01HelloworldApplication.class, args);
}
}
结论:springboot所有自动配置都是在启动的时候扫描并加载:spring.factories
所有的自动配置类都在这里,但不一定生效,要判断条件是否成立,只要导入了对应的start,就有对应的启动器了,有了启动器,我们的自动装配就会生效,然后就配置成功。
@SpringBootApplication // 标注这个类是一个springboot的应用:
- springboot在启动时,从类路径下 /META-INF/spring.factories 获取指定的值;
- 将这些自动配置的类导入容器,自动配置就会生效,进行自动配置;
- 以前我们需要自动配置的东西,现在springboot帮我们做了;
- 整合javaEE,解决方案和自动配置的东西都在spring-boot-autoconfigure包下;
- 他会把所有需要导入的组件,,以类名的方式返回,这些组件就会被添加到容器中;
- 容器中也会存在非常多的 xxxAutoConfiguration的文件(@Bean),就是这些类给容器中导入了这个场景需要的所有组件,并自动配置,@Configuration, JavaConfig;
- 有了自动配置类,免去了我们手动编写配置文件的工作。
SpringApplication.run():
两部分:一部分是SpringApplication的实例化;二是run方法的执行。
SpringApplication:
- 推断应用的类型是普通的项目还是Web项目;
- 查找并加载所有可用初始化器,设置到initializers属性中;
- 找出所有的应用程序监听器,设置到listeners属性中;
- 推断并设置main方法的定义类,找到运行的主类。
Springboot:配置文件及自动配置原理
配置文件
Springboot使用一个全局的配置文件,配置文件名称是固定的;
- application.properties 【语法结构 key=value】
- application.yaml 【语法结构 key: 空格 value】
配置文件的作用:修改Springboot自动配置的默认值,因为Springboot在底层都给我们配置好了。
Yaml
标记语言:以前的配置文件,大多数都是使用xml来配置;比如一个简单的端口配置,我们来对比下yaml和xml:
yaml配置:
server:
poprt: 8080
xml配置:
<server>
<port>8081</port>
</server>
name: laomao
# 对象
student:
name: laomao
age: 5
# 行内写法
student: {name: laomao,age: 5}
# 数组
pets:
- cat
- dog
- pig
- bird
pets: [cat,dog,pig,bird]
# 只能保存键值对
name=laomao
student.name=laomao
student.age=5
给属性赋值的几种方式
yaml可以直接给实体类赋值
解决@ConfigruationProperties()报错需要导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
解决乱码问题
配置文件除了yaml,还有我们之前常用的properties
@value值注入
对比:
松散绑定:驼峰命名可以和短横线绑定【last-name 与 lastName】;
JSR303数据校验,就是我们可以在字段增加一层过滤器验证,可以保证数据的合法性;
复杂类型封装,yml中可以封装对象,使用@value不支持。
JSR303校验
@Validated // 数据校验
百度搜索 JSR303校验注解即可!
多环境配置及配置文件位置
yaml文件位置
yaml可以实现多文档模块
server:
port: 8081
spring:
profiles:
active: dev
---
server:
port: 8082
spring:
profiles: dev
---
server:
port: 8083
spring:
profiles: test
SpringBoot Web 开发
jar: webapp!
自动装配
springboot到底帮我们配置了什么?我们能不能修改?能修改哪些东西?能不能扩展?
- xxxAutoConfiguration… 向容器中自动配置组件
- xxxProperties: 自动装配类,装配配置文件中自定义的一些内容。
要解决的问题:
- 导入静态资源
- 首页
- jsp,模板引擎 Thymeleaf
- 装配和扩展SpringMVC
- 增删改查
- 拦截器
- 国际化
静态资源
- 在springboot中,我们可以用以下方式处理静态资源
- webjars
- public, static, /**,resources localhost:8080/
- 优先级:resource>static(默认)>public
首页和图标定制
index.html文件可以放在 public、resources、statics、templates【一般将index.html放在templates下,通过Controller才能访问到这个文件夹】。
Thymeleaf 模板引擎
前端交给后端的页面,是html页面。如果我们之前开发,需要把他们转成jsp页面,jsp好处就是当我们查出一些数据转发到JSP页面后,可以用jsp轻松实现数据的显示,及交互等。jsp支持非常强大的功能,包括能写java代码。
但是现在,Springboot这个项目首先是以jar的方式,不是war;此外,我们使用的是嵌入式的Tomcat,默认不支持jsp。如果我们直接用纯静态页面的方式,会给开发带来很大的麻烦,Springboot推荐使用模板引擎。
模板引擎 是jsp就是一个模板引擎,还有freemarker。
thymeleaf在github的主页:https://github.com/thymeleaf/thymeleaf
thymeleaf官网:https://www.thymeleaf.org/
spring官方文档:找对应版本。
添加依赖
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-java8time</artifactId>
</dependency>
结论:
只要需要使用thymeleaf,只需要导入对应的依赖就可以了,我们将html放在我们的templates目录下。
使用thymeleaf:
导入约束
<html xmlns:th="http://www.thymeleaf.org">
text&utext: