Spring Boot学习笔记
SpringBoot
Spring 是一个开源框架,作者Rod Johnson
目的是为了解决企业级应用开发的复杂性而创建的,简化开发
Spring是如何简化Java开发的
为了降低Java开发的复杂性,Spring采用了以下四种关键策略
- 1、基于POJO的轻量级和最小入侵性编程
- 2、通过IOC,依懒注入(DI)和面向接口编程实现松耦合
- 3、面向切面(AOP)和惯例进行声明式编程;
- 4、通过切面和模板减少样式代码
零、什么是Springboot
Springboot 可以简单的认为是一个Javaweb开发框架。最显著的特点就是 【约定大于配置】,you can just run
所有的技术框架的发展似乎都遵循了一条主线规律:从一个复杂的应用场景衍生出一种规范的框架,人们只需要进行各种配置而不需要自己去亲自实现它,这时候强大的配置功能就成了有点;发展到一定程度之后,人们根据实际生产的应用情况,选取其中实现功能和设计精华,重构出一些轻量级的框架;之后为了提高开发效率,开始嫌弃原有的各种配置,认为过于麻烦,于是开始提倡【约定大于配置】,进而衍生出一些一站式解决方案。
Java企业级应用框架的发展就是==>J2EE——>Spring——>Springboot
随着Spring的不断发展,设计的领域也是越来越多,项目整合开发需要配合各种各样的文件,慢慢的变得不是那么易用简单,违背了最初的理念,甚至人称【配置地狱】。SpringBoot正是在这一个背景下被抽象出来的框架,目的是为了让大家更容易的使用Spring、更容易的集成各种常用的中间件、开源软件。
SpringBoot 基于 Spring 开发,SpringBoot 本身并不提供 Spring 框架的核心特性以及扩展功能,只是用于快速、敏捷的开发新一代基于Spring框架的应用程序。也就是说,它并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具。SpringBoot以==约定大于配置的核心思想==默认帮我们完成了很多设置,多数SpringBoot应用只需要很少的Spring配置。同时他集成了大量常用的第三方库配置(例如:Redis、MongoDB、Jpa、RabbitMQ、Quartz等等),SpringBoot应用中这些第三方库几乎可以零配置的开箱即用。
简单的来说就是SpringBoot其实不是什么新的框架,他默认配置了很多框架的使用方式,就像是Maven整合了许多Jar包一样,SpringBoot 整合了所有的框架。
SpringBoot出生名门,从一开始就站在了比较高的起点,生态也足够完善。
SpringBoot主要的优点
- 为所有的Spring开发者更快的入门
- 开箱即用,提供各种默认的配置来简化项目配置
- 内嵌式容器简化WEB项目
- 没有冗余的代码生成和XML配置的要求。
程序 = 数据结构 + 算法;程序员
程序 = 面向对象 + 框架;码农
一、微服务
1、什么是微服务
微服务是一种架构风格,他要求我们在开发一个应用的时候,这个应用必须构建成一系列小服务的组合;可以通过http的方式进行互通。要说微服务架构,就要提到单体应用架构。
架构风格
- MVC 架构
- MVVM 架构
- 微服务架构
2、单体应用架构
所谓单体应用架构【all in one】是指,我们将一个应用中的所有应用服务都封装在一个应用中。
无论是ERP、CRM或者是其他什么系统,你都把数据库访问,web访问等各个功能放在一个war包下。
- 这样做的好处是,易于开发和测试;也十分方便部署;当需要扩展时,只需要将war包赋值多分,然后放在多个服务器上,在做个负载均衡就可以了。
- 单体应用的缺点就是,哪怕我们要修改一个很小的地方,我们都需要停掉整个服务,重新打包,部署整个应用的war包。特便是对于一个大型应用,我们不可以把所有的内容都放到一个应用里面,我们如何维护、如何分工合作都是问题。耦合性高。
3、微服务架构
all in one 的架构方式,我们把所有的功能单元放在一个应用里面。我们然后把整个应用部署到服务器上。如果负载能力不行,我们将整个应用进行水平赋值,进行扩展,然后再负载均衡。
所谓微服务架构,就是打破之前 All in One 的架构方式,把每个功能单元元素独立出来。把独立出来的功能元素动态组合,需要的功能元素才拿去组合,需要多一些功能时就整合多个功能 元素。所以微服务架构是对功能元素的复制,而没有对整个应用进行复制。——> 高内聚低耦合
优点:
- 节省了调用资源
- 每个功能元素的服务都是一个可替代的、可独立升级的软件代码。
原文链接:
https://martinfowler.com/articles/microservices.html
翻译链接:(巨赞)
http://blog.cuicc.com/blog/2015/07/22/microservices/#进化式设计
https://www.jianshu.com/p/4821a29fa998
4、如何构建微服务
一个大型系统的微服务架构,就像一个复杂交织的神经网络,每一个神经元都是一个功能元素,他们各自完成自己的功能,然后通过http相互请求调用。比如一个电商系统,查缓存,连接数据库、浏览页面、结账、制度等服务都是一个个独立的功能服务,都被微化了,它们作为一个个微服务共同构建了一个庞大的系统,如果修改其中一个功能,只需要更新升级其中一个功能服务单元即可。
但是这种庞大的系统架构给部署人员和运维人员带来了很大的难度。于是,Spring为我们带来了构建大型分布式微服务的全套、全程产品。
- 构建一个个功能独立的微服务应用单元,可以使用Springboot,可以帮助我们快速的构建一个应用;
- 大型分布式网络服务的调用,这部分由SpringCloud来完成,实现分布式;
- 在分布式中间,进行流式数据计算、批处理,我们有SpringCloud data Flow。
- Spring为我们想清楚了整个从开始构建应用到大型分布式应用的全流程方案。
二、第一个SpringBoot程序
环境
- JDK1.8
- Maven3.6.1
- Springboot
- IDEA
创建方式
Idea创建(内部集成了Spring Initializr.)
修改端口号
自定义banner
三、SpringBoot自动装配原理
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会将所有的功能场景,变成一个个的启动器
我们需要使用什么功能就只需要找到对应的启动器就可以了。
主程序
@SpringBootApplication
核心注解。说明这个类是SpringBoot的主配置类
SpringBoot就应该运行这个类的main方法来启动SpringBoot应用。
//本身就是Spring的组件
@SpringBootApplication//标注这个类是一个Springboot的应用
public class DemoApplication {
//将Springboot应用启动
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
-
注解
-
@SpringBootConfiguration ==> springboot的配置 @Configuration ==> spring 配置类 @Component ==> 这也是一个Spring的组件 配置类也是容器中的一个组件 @EnableAutoConfiguration ==> 开启自动配置功能,这个注解告诉Springboot自动配置 @AutoConfigurationPackage ==> 自动配置包 @Import({Registrar.class})==>Spring的底层注解给容器导入一个组件,自动配置‘包注册’ 将主配置类(@SpringBootApplication标注的类)的所在的包以及下面的子包里面的所有组件扫描到Spring容器总中。这就是要求保证与入口类在同一包下的原因。 @Import({AutoConfigurationImportSelector.class})==>给容器中导入组件,即自动导入选择器。 AutoConfigurationImportSelector是导入哪些组件的选择器 将所有需要导入的组件以全类名的方式返回;这些组件就会被添加到容器中。 最终会被容器中自动导入非常多的自动配置类(xxxAutoConfiguration);就是在这个个容器中导入这个场景需要的所有组件,并配置好这些组件。
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j98U5pP2-1603591878723)(C:\Users\acer\AppData\Roaming\Typora\typora-user-images\image-20201018235025258.png)]
有了自动配置类就免去了我们手动配置注入功能组件的工作。
getSpringFactoriesLoaderFactoryClass( EnableAutoConfiguration.class, classLoad)
主程序启动
@SpringBootApplication
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
- SpringApplication类
- run 方法
SpringApplication类
- 推断应用的类型是普通项目还是Web项目
- 查找并加载所有的可用初始化器,设置到initializers属性中
- 找出所有的应用程序监听器,设置到listeners属性中
- 推断并设置main方法的定义类,找到运行的主类。
Springboot两个显著特点
- 自动装配【原理】——>全面装配SpringMVC配置!
- run方法【四个过程】
四、配置文件
Springboot配置文件
SpringBoot使用一个全局的配置文件,配置文件的名称是固定的
- application.propertise
- 语法结构:key=value
- application.yml
- 语法结构:
key: 空格 value
- 语法结构:
配置文件的作用:修改SpringBoot自动装配的默认值,因为SpringBoot在底层都给我们自动装配好了。
YAML语法
yaml是"Yaml Ain‘t a Markup Language"(YAML不是一种标记语言)的递归缩写。
在开发这种语言时,YAML的意思是“Yet Another Markup Language”【仍是一种标记语言】
YAML A Markup Language:是一个标记语言
YAML isnot Markup Language:不是一种标记语言
以上来自百度的胡扯
标记语言
以前的配置文件,大多数都是使用xml 来配置的:比如一个简单的端口配置,我们来对比下yaml 和 xml
yaml配置
server:
port: 8081
xml配置
<server>
<port>8081</port>
</server>
application.propertise
application.yml
yaml可以存储对象,对空格的要求及其严格
student:
name: shiqing
age: 23
#对象行内写法
student: {name: shiqing, age: 23}
#数组
pets:
-cat
-dog
-pig
#数组行内写法
pets: [cat,dog,pig]
yaml 可以直接给实体类赋值
**@ConfigurationProperties(prefix = "person")
**绑定指定的配置文件中的内容
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private Integer age;
private Boolean happy;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
person:
name: shiqing
age: 22
happy: false
birth: 2019/10/19
maps: {k1: v1,k2: v2}
lists:
- code
- music
- girl
dog:
name: 小黑
age: 2
#使用EL表达式的随机占位符
person:
name: shiqing${random.int}
age: ${random.uuid}
#设置默认值person.hello不存在就是使用后面的值
dog:
name: ${person.hello:hello_}小黑
age: 2
- ConfigurationProperties 只需要写一次即可,Value 则需要每个字段都添加
- 松散绑定:比如yml中写的是last-name,这个和 lastName是一样的,后面的字母默认大写。这就是松散绑定。
- JSR303数据校验,这个就是我们可以在字段上增加一层过滤器验证,可以保证数据的合法性,复杂类型封装,yml中可以封装对象,使用@Value就不支持了。==> 规范输入内容
JSR303数据校验
导包
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
注解:@Validated
@Email(message = "邮箱格式错误")
验证数据格式的注解
项目配置文件
优先级:
- file:./config/
- file:./
- classpath:/config/
- classpath:/
多环境配置
properties方式
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T6lX3svy-1603591878742)(C:\Users\acer\AppData\Roaming\Typora\typora-user-images\image-20201019143425741.png)](https://img-blog.csdnimg.cn/20201025101205413.png#pic_center)
yaml方式
---
server:
port: 8081
spring:
profiles:
active: dev
---
server:
port: 8082
spring:
profiles: dev
---
server:
port: 8083
spring:
profiles: test
---
自动装配再分析
在我们的配置文件中配置的东西,都存在一个固有的规律
一定存在形同 xxxProperties
【封装了配置文件中的相关属性】 的文件,要被 xxxAutoConfiguration
【自动装配类】 文件装配。 xxxProperties 加载自定义的文件,与配置文件绑定,这样类中的属性就可以通过配置文件使用自定义的配置。
-
xxxProperties
:封装了配置文件中的相关属性 -
xxxAutoConfiguration
:自动装配类
精髓:
- SpringBoot 启动会加载大量的配置类
- 我们要看据需要的功能有没有在SpringBoot默认写好的自动装配的类当中;
- 我们在去看自动装配类中配置了哪些组件;【只要我们要用到的组件存在其中,就可以不用手动配置】
- 给容器中自动装配类添加组件的时候,会从properties类中获得某些属性,我们只需要在配置文件中给这些属性赋值即可(形如给实体类赋值一样)
那么这么多的配置类,必须在一定的条件下才能生效,也就是说,我们加载了这么多的配置类,单不是所有的都生效
我们怎么知道哪些自动配置类生效?我们可以通过启动debug=true
属性;来让控制台打印配置报告,这样就是能知道是哪些自动配置类生效了
debug = true
- Positive matches:自动配置类启用的;正匹配
- Negative matches:(没有启动,没有匹配成功的自动配置类:负匹配)
- Unconditional classes:(没有条件的类)
五、SpringBoot Web开发
自动装配
- 创建应用,选择模块
SpringBoot 到底帮我们配置了什么?我们能不能修改,能修改哪些东西,能不能扩展?
- xxxAutoConfiguration—向荣其中自动配置组件
- xxxProperties:自动配置类,装配文件中自定义了哪一些内容
解决的问题
- 导入静态资源
- 首页
- jsp——> 模板引擎Thymeleaf
- 装配扩展 SpringMVC
- 增删改查Mybatis
- 拦截器
- 国际化!
5.1、静态资源
什么是webjars?
用jar包的方式引入 jQuery npm等框架
在SpringBoot中,可以使用以下方式处理静态资源
- webjars ==> localhost:8080/webjars/…
- public、 static、/**、resources ==> localhost:8080
优先级:resources > static (默认使用) > public
5.2、首页
在静态资源中,自动匹配index.html
本文地址:https://blog.csdn.net/weixin_43866812/article/details/109270460