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
创建方式
Spring Initializr.
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: shiqingage: 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: shiqingage: 22happy: falsebirth: 2019/10/19maps: {k1: v1,k2: v2}lists:- code- music- girldog: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
Spring Boot学习笔记(一)相关推荐
- Spring Boot学习笔记-实践建言
2019独角兽企业重金招聘Python工程师标准>>> 本文延续<Spring Boot学习笔记-快速示例>,从开发指南中摘出一些实践经验可供参考.这也是笔者看到的眼前一 ...
- Spring Boot学习笔记-进阶(3)
文章目录 Spring Boot学习笔记-进阶(3) 一.Spring Boot与缓存 二.Spring Boot与消息 三.Spring Boot与检索 四.Spring Boot与任务 异步任务 ...
- Spring Boot学习笔记-基础(2)
Spring Boot学习笔记-基础(2) Spring Boot 优点: – 快速创建独立运行的Spring项目以及与主流框架集成 – 使用嵌入式的Servlet容器,应用无需打成WAR包 – st ...
- Spring Boot学习笔记(1)
文章目录 Spring Boot学习笔记(1) Spring Boot 整合 JSP Spring Boot HTML Thymeleaf 常用语法 Spring Boot 数据校验 Spring B ...
- Vue + Spring Boot 学习笔记02:引入数据库实现用户登录功能
Vue + Spring Boot 学习笔记02:引入数据库实现用户登录功能 在学习笔记01里,我们利用跨域打通了前端的Vue与后端的Spring Boot,实现了用户登录功能,但是后台的登录控制器在 ...
- Vue + Spring Boot 学习笔记01:实现用户登录功能
Vue + Spring Boot 学习笔记01:实现用户登录功能 一.创建后端Spring Boot项目Book Management 二.创建前端Vue项目bm-vue 三.修改后端项目Book ...
- 超赞:不愧是阿里内部“Spring boot学习笔记”从头到尾,全是精华
spring boot为何会出现? 随着动态语言的流行(Ruby.Groovy. Scala. Node.js),Java 的开发显得格外的笨重:繁多的配置.低下的开发效率.复杂的部署流程以及第三方技 ...
- Spring Boot学习笔记 [完结]
Spring Boot 文章目录 Spring Boot 1.微服务 1.1 什么是微服务? 1.2 单体应用架构 1.3 微服务架构 2. 第一个SpringBoot程序 2.1.原理 2.2 原理 ...
- Spring Boot 学习笔记--整合Thymeleaf
1.新建Spring Boot项目 添加spring-boot-starter-thymeleaf依赖 1 <dependency> 2 <groupId>org.spring ...
- 【Spring Boot学习笔记】——配置文件
两种类型的配置文件 properties和yml 作为全局配置文件,配置文件名是固定的: application.properties application.yml 配置文件的作用:修改Spring ...
最新文章
- JAVA坏境变量中的JAVA_HOME path classpath 的设置与作用。
- 51单片机复习:矩阵键盘
- EF 表联合查询 join
- Tensorflow源码解析1 -- 内核架构和源码结构
- linux 权限777_Linux编程之权限系统与工具使用(二)
- spring AOP 取得web的session
- c++和java哪个难_2020 年 11 月编程语言排行榜,Python 超越 Java ?
- 双列集合Map的实现类
- 怎么撤回操作_微信又更新,拍一拍能撤回了
- 61 SD配置-科目分配-分配税收确定的交货工厂
- 填坑帖 By cellur925
- 《延世大学韩国语教程2》第二十课 办公室(上)
- QT 6.3和Visual Studio 2022详细安装及配置教程
- 邮件服务器1---原理以及基本概念
- 动态规划之LCS算法
- 服务器突然断电文件系统损坏,电脑突然断电造成系统文件损坏该如何修复?(高级篇)...
- java使用ZipOutputStream时出现的“不可预料的压缩文件末端”问题
- AcWing 95. 费解的开关 (yxc代码保姆级题解+注释)
- 对校招生培养工作的建议_关于招生工作的一些建议与想法
- 纯CSS3画哆啦A梦
热门文章
- Postgresql -XL 10r.1.1安装部署详解(跳过N多坑)
- 不写代码,去旅游了。
- JZ2440 v3.0 linux-3.4.2 busybox1.20.0内核 和 文件系统移植 修改分区大小 yaffs2文件系统补丁 开源资源查找
- 葡萄酒自媒体怎么运营?如何推广增加品牌曝光度?
- win定时关机_电脑一分钟小技巧:如何将电脑设置为定时关机?
- 程序员应该如何提升自己
- 一款好用的一键重装系统软件 v2.8
- windows下自带计算文件MD5的工具
- linux 一键安装lamp
- 解读|爱奇艺互动剧创作技术实操攻略