springboot学习
Posted 轻舟一曲
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot学习相关的知识,希望对你有一定的参考价值。
开篇
SpringBoot官方doc:
https://docs.spring.io/spring-boot/docs/
<html lang="en" xmlns:th="http://www.thymeleaf.org">
前情回顾
- JavaSe:OOP
- mysql:持久化
- Html5+CSS3+javascript+jQuey+框架:视图层
- JavaWeb:原始独立开发MVC三层架构网站
- SSM框架:简化开发流程,但是配置也开始较为复杂
- 项目打war包:Tomcat中运行
- Spring在简化:SpringBoot—>进入微服务架构时代!
- 项目打jar包,内嵌Tomcat
- 服务越来越多:SpringCloud
微服务阶段:SpringBoot
学习路线
SpringBoot介绍
Spring是一个开源框架,或者通俗的讲就是一个容器。
Spring是如何简化Java开发的
Spring采用4中关键策略:
- 基于POJO的轻量级和最小侵入性编程;
- 通过IOC,依赖注入DI和面向接口实现松耦合;
- 基于切面AOP和惯例进行声明式编程;
- 通过切面和模板减少代码样式。
什么是SpringBoot?
SpringBoot基于Spring4.0设计,Spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决。
SpringBoot所具备的特征有:
- 可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;
- 内嵌Tomcat或Jetty等Servlet容器;
- 提供自动配置的“starter”项目对象模型(POMS)以简化maven置;
- 绝对没有代码生成,不需要XML配置。
SpringBoot框架中还有两个非常重要的策略:开箱即用和约定优于配置。
什么是开箱即用?
是指在开发过程中,通过在MAVEN项目的pom文件中添加相关依赖包,然后使用对应注解来代替繁琐的XML配置文件以管理对象的生命周期。这个特点使得开发人员摆脱了复杂的配置工作以及依赖的管理工作,更加专注于业务逻辑。
什么是约定大于配置?
是一种由SpringBoot本身来配置目标结构,由开发者在结构中添加信息的软件设计范式。这一特点虽降低了部分灵活性,增加了BUG定位的复杂性,但减少了开发人员需要做出决定的数量,同时减少了大量的XML配置,并且可以将代码编译、测试和打包等工作自动化。
前端常使用模板引擎
主要有FreeMarker和Thymeleaf
程序=数据结构+算法—程序员
???
程序=面向对象+框架—码农
微服务介绍
MVC三层架构 MVVM前端架构 微服务架构;
业务:service:UserService:===>模块;
Springmvc,controller===>提供接口;
微服务是一种架构风格,它要求我们在开发一个应用的时候,这个应用2必须构建成一系列小服务的组合;通过http,rpc的方式互通。
单体应用架构
应用中的所有应用服务都封装在一个应用中。无论是ERP,CRM或是其他系统,都把数据库访问和web访问等等功能放到一个war内。
优点:
- 易于开发和调试,方便部署;
- 需要拓展时只需要将war复制多份,然后放到多个服务器上,再做个负载均衡就可以了。
缺点:
- 哪怕修改一个很小的地方,都需要停掉整个微服务,重新打包,重新部署这个war包;
- 特别是对于大型应用,我们不可能将所有内人放在一个应用里,所以如何维护和分工;
微服务架构
所谓微服务架构,就是把每个功能独立出来,把独立出来的功能元素动态组合,需要的功能才拿去组合,需要多一些时可以整合多个功能元素。所以微服务架构是对功能元素的复制,而没有对整个应用进行复制。
优点:
- 节省调用资源
- 每个功能元素的服务都是一个可替换额,可独立升级的软件代码;
自由组装。
微服务架构(Microservices) | 黯羽轻扬 (ayqy.net)
第一个SpringBoot
- jdk1.8
- maven3.6
- springboot
- idea
创建:
-
官方提供了快速生成的网站
-
idea继承了了这个网站
项目结构:
需要在HellowordApplication同级目录下建包
测试:@RestController<=>@RequestMapping+@RequestBody;
接口自动装配了,写了就能直接运行。
springboot所有依赖都是使用Spring-boot开头:
这里的web依赖用于实现http接口,依赖中包含了Springmvc,官网描述:
使用springmvc构建web包括restful的应用程序的入门者,使用Tomcat作为默认嵌入式容器。
packget打包成jar包,不依赖其他东西直接可执行:
使用idea创建第一个SpringBoot程序
删除多余文件:
导入web依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.5.0</version>
</dependency>
spring-boot-starter默认就是一个启动器。
测试:
@Controller
@RequestMapping("/test01/")
public class hello
//返回字符串
@RequestMapping("/hello")
@ResponseBody
public String test01()
return "我的第一个SpringBoot程序";
可以直接在application.properties配置文件中修改端口号:
server.port=8081
创建自己的banner
banner.txt
_____ _____ _____ _____
/\\ \\ /\\ \\ /\\ \\ /\\ \\
/::\\____\\ /::\\ \\ /::\\ \\ /::\\____\\
/::::| | /::::\\ \\ /::::\\ \\ /:::/ /
/:::::| | /::::::\\ \\ /::::::\\ \\ /:::/ /
/::::::| | /:::/\\:::\\ \\ /:::/\\:::\\ \\ /:::/ /
/:::/|::| | /:::/__\\:::\\ \\ /:::/__\\:::\\ \\ /:::/ /
/:::/ |::| | /::::\\ \\:::\\ \\ /::::\\ \\:::\\ \\ /:::/ /
/:::/ |::|___|______ /::::::\\ \\:::\\ \\ /::::::\\ \\:::\\ \\ /:::/ / _____
/:::/ |::::::::\\ \\ /:::/\\:::\\ \\:::\\ \\ /:::/\\:::\\ \\:::\\ \\ /:::/____/ /\\ \\
/:::/ |:::::::::\\____\\/:::/ \\:::\\ \\:::\\____\\/:::/ \\:::\\ \\:::\\____\\|:::| / /::\\____\\
\\::/ / ~~~~~/:::/ /\\::/ \\:::\\ /:::/ /\\::/ \\:::\\ \\::/ /|:::|____\\ /:::/ /
\\/____/ /:::/ / \\/____/ \\:::\\/:::/ / \\/____/ \\:::\\ \\/____/ \\:::\\ \\ /:::/ /
/:::/ / \\::::::/ / \\:::\\ \\ \\:::\\ \\ /:::/ /
/:::/ / \\::::/ / \\:::\\____\\ \\:::\\ /:::/ /
/:::/ / /:::/ / \\::/ / \\:::\\__/:::/ /
/:::/ / /:::/ / \\/____/ \\::::::::/ /
/:::/ / /:::/ / \\::::::/ /
/:::/ / /:::/ / \\::::/ /
\\::/ / \\::/ / \\::/____/
\\/____/ \\/____/ ~~
自动装配原理
pom.xml
核心依赖spring-boot-dependencies在父工程中:
在引入一些SpringBoot依赖的时候不需要指定版本就是因为有这个版本仓库。
启动器
就是Springboot的启动场景。
比如spring-boot-starter-web就会帮我们导入外部环境的所有依赖。
SpringBoot将所有的功能场景都变成了一个个启动器。
主程序
注解:
-
@SpringBootApplication
-
@SpringBootConfiguration
SpringBoot的配置
-
@Configuration
-
@EnableAutoConfiguration
-
AutoConfigurationPackage
自动导入配置,包注册
-
@AutoConfigurationImportSelector.class 自动导入选择
获取所有文件的配置:
获取候选的配置:
自动配置的核心文件:
springboot工厂的加载:
-
小结
SpringBoot中所有自动配置都是在启动的时候并加载:spring.factories包含所有的自动配置类,但是要导入对应的start启动器其对应的自动装配配置才能生效。
- SpringBoot在启动的时候,从类路径下/META-INF/spring.factories获取指定的值;
- 将这些自动配置类导入容器,自动配置就会生效,帮我们自动配置;
- 以前我们需要自动配置的东西,现在SpringBoot帮我们做了;
- 整个JavaEE,解决方案和自动配置的东西都在spring-boot-autoconfigure-2.4.4.jar下;
- 它会将所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器;
- 容器中也会存在非常多的xxxAutoConfiguration(@Bean)的文件,就是这些类给容器中导入了这个场景的所有组件;并自动配置,@Configuration ,JavaConfig;
- 有了自动配置类,就免去了我们手动编写配置文件的工作。
主启动类运行
这个main方法其实是开启了一个服务。
分析该方法主要两部分,一部分是SpringApplication的实现,二是run方法的实现。
SpringApplication类
JavaConfig @Configuraion @Bean
主要做4件事:
- 推断应用的类型是普通的项目还是web项目;
- 查找并加载所有可用初始化器,设置到intializers属性中;
- 找出所有的应用程序监听器,设置到listens属性中;
- 推断并设置main方法的定义类,找到运行的主类。
构造器:
启动:
yaml
概述
(25条消息) Springboot-官方详细配置_叶巨岩的博客-CSDN博客
YAML是"YAML Ain’t a Markup Language"(YAML不是一种标记语言)的递归缩写。开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。
properties只能保存键值对。
application.yaml:对空格的要求非常严格,层级关系
# 普通的k=name
name: 上官
# 对象
student:
name: 婉儿
age: 18
# 行内写法
student2: name:婉儿,age:18
# 数组
pets:
- cat
- dog
- pig
pets2: [cat,dog,pig]
application.yaml强大之处在于可以注入到配置类和实体类当中。
属性赋值
yaml
Spring方式:@Value() @Autowired
@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dog
@Value("西西")
private String name;
@Value("9")
private Integer age;
自动装配:
@Autowired
//有很多条狗时用@Qualifier()指定
Dog dog;
@Test
void contextLoads()
缺点:需要在源代码里配多个实体比较麻烦。
通过yaml实现 @ConfigurationProperties
Person:
name: 上官$ramdon.int
age: 18
happy: true
birth: 2021/5/27
map: k1: v1,k2: v2
list:
- music
- code
- beauty
dog:
name: $person.name:helllo_花花
age: 3
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
绑定:@ConfigurationProperties(prefix = “person”)
@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
@ConfigurationProperties(prefix = "person")
public class Person
private String name;
private Integer age;
private boolean happy;
private Date birth;
private Map<String,Object> map;
private List<Object> list;
private Dog dog;
测试:
@Autowired
private Person person;
@Test
void contextLoads()
System.out.println(person);
properties
指定配置文件。
@PropertySource(value = "classpath:mf.properties")
还需要取,所以相对yaml不是很灵活。
@PropertySource(value = "classpath:mf.properties")//加载指定的配置文件
public class Person
//Spring的El表达式取出配置文件的值
@Value("$name")
private String name;
JavaConfig绑定配置文件的值可以采取以上两种方式。
对比
- 松散绑定:比如yaml中写的last-name,这个和lastName是一样的。
- JSR303数据校验:这个就是我们可以在字段增加一层过滤器验证,可以保证数据合法性。
- 复杂类型封装:yaml中可以封装对象,使用@value就不行。
如果只是想获取其中的一个值可以使用@value,但是官方强烈推荐yaml.
JSR303
@Validated//开启数据校验
注解启动器:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
@Component //注册bean
@Data
@AllArgsConstructor
@NoArgsConstructor
@ConfigurationProperties(prefix = "person")
@Validated//数据校验
public class Person
@Email(message="必须为邮件格式")
private String name;
@Max(value = 20,message="有点老哦")
private Integer age;
@NotNull(message="happy不能为空")
private boolean happy;
private Date birth;
private Map<String,Object> map;
private List<Object> list;
private Dog dog;
有个小问题就是:Boolean不能用@NotNull判断。。。
环境配置
概述
多环境配置以及配置文件位置。
四个有优先级:1>4>2>3 我们默认配置是3优先级最低的一个
多环境切换
真实开发:测试环境,生产环境。。。
profile是Spring对不同环境提供不同配置功能的支持,可以激活不同的环境版本,实现快速切换环境:
方式一:多配置文件
server:
port: 8081
#springboot的多环境配置,选择激活那一套环境
spring:
profiles:
active: dev
以上写法是properties的,懒得改了;
现在介绍yaml的可以直接在一个yaml文件配置多套环境:
server:
port: 8081
spring:
profiles:
active: dev
---
server:
port: 8082
spring:
profiles: dev
---
server:
port: 8083
spring:
profiles: test
自动配置再讲解
配置文件到底可以写什么。。。
与spring.factories具有非常强的联系。
举例:codec.CodecsAutoConfiguration
@Configuration(//表示是一个配置类
proxyBeanMethods = false
)
@ConditionalOnClass(CodecConfigurer.class, WebClient.class)//spring底层注解,根据不同条件判断当前类是否生效
@AutoConfigureAfter(JacksonAutoConfiguration.class)
@EnableConfigurationProperties(CodecProperties.class)//自动配置的配置属性
在我们的配置文件中能配置的东西都存在一个固有的规律:
xxxAutoConfiguration—>xxxProperties—>配置文件绑定—》我们就可以使用自定义配置了。
自动装配原理精髓:
- SpringBoot启动加载大量的自动配置类;
- 我们看看需要的功能有没有在SpringBoot默认写好的自动配置类中;
- 然后再看这个自动配置类中到底配置了那些组件,只要我们要用的组件存在其中我们就不需要手动配了;
- 给容器中自动配置类添加组件时,会从properties类中获取某些属性,我们只需要在配置文件中指定这些属性的值就好。
xxxAutoConfiguration:自动配置类;给容器中添加组件;
xxxProperties:封装配置文件中相关属性。----》SpringBoot配置 yaml
查看哪些配置类生效:debug: true
Web开发
概述
jar:webapp!
自动装配,SpringBoot到底帮我们配置了什么东西?可以修改吗?可以扩展吗?
- xxxAutoConfiguration:向容器中自动配置组件;
- xxxProperties:自动配置类装配配置文件中自定义的内容。
web开发要解决的问题:
- 导入静态资源。。。
- 首页
- jsp–》模板引擎Thymeleaf
- 装配和拓展springmvc
- 增删改查
- 拦截器
- 中英文切换
静态资源
方式一
webjars是什么?
所支持的目录
在/**下的东西都会在这四个静态资源的目录下找:
优先级:resource>static>public
一般:public放js,static放图片,resource放上传文件。
总结:
- 在SpringBoot,我们可以使用一下几种方式处理静态资源
- webjars
映射localhost:808/webjars/
- /**>resource>static(默认)>public
直接映射localhost:808/
- webjars
首页
//在template下的所有页面之只能通过controller来跳转
//需要模板引擎的支持
@Controller
public class Index
@RequestMapping("/index")
public String index()
return "index";
修改图片为ico:先另存为这串名字然后在删除;
直接另存为ico就行了。
thymeleaf
概述
找到依赖:高版本还不好找
https://docs.spring.io/spring-boot/docs/2.0.3.RELEASE/reference/htmlsingle/#using-boot-starter
导入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
语法
导入约束
<html lang="en" xmlns:th="http://www.thymeleaf.org">
$... 变量表达式,Variable Expressions
@... 链接表达式,Link URL Expressions
#... 消息表达式,Message Expressions
~... 代码块表达式,Fragment Expressions
*... 选择变量表达式,Selection Variable Expressions
测试:
@Controller
public class Index
@RequestMapping("/test")
public String test(Model model)
model.addAttribute("msg","Thymeleaf by Model");
return "test";
所有的html元素都可以被thymeleaf
以上是关于springboot学习的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot-Mybatis_Plus学习记录之公共字段自动填充
SpringBoot学习-SpringBoot添加支持CORS跨域访问
第257天学习打卡(知识点回顾 springboot自动配置)
第272天学习打卡(知识点回顾springboot异常处理步骤流程)