SpringBoot01
SpringBoot
微服务阶段
JavaSE:OOP的编程思想,及Java的基础应用
mysql:数据的持久化
html+css+js+vue+框架:视图层
Javaweb:独立开发MVC三层架构的网站,原始状态
ssm:框架,简化开发流程,配置变得复杂
war:tomcat服务器运行
spring再简化:SpringBoot-jar:内嵌tomcat,微服务架构
管理微服务:SpringCloud
SpringBoot核心:自动装配
学习路线
Spring的目的:简化企业级应用开发而创建
Spring如何简化开发的:
- 基于POJO的轻量级和最小入侵性编程
- 通过IOC,依赖注入(DI)和面向接口实现松耦合
- 基于切面(AOP)和惯例进行声明式编程
- 通过切面和模板减少样式代码
SpringBoot是如何做的:
- 约定大于配置
- 简化配置
- 集成了很多第三方库
- 集成容器简化web开发
技术创建的发展规律:
- 从一个复杂的应用场景衍生一种规范框架,人们只需要进行各种配置而不需要自己去实现他,这时候强大的配置成了优点,发展到一定程度,人们根据实际的应用情况,选取其中的实用功能和设计精华,重构出一些轻量级的框架,之后为了提高开发效率,简化各种繁琐的配置,开始提倡"约定大于配置",进而衍生出一些一战式的解决方案。
微服务的架构
- 单体应用架构:所有的功能都放到一个war包内(数据库,web访问,业务功能等)
- 优点
- 易于开发和测试
- 方便部署
- 做扩展时将war放到多个服务器,然后做负载均衡就行
- 缺点:
- 不易更新(需要替换整个服务)
- 不易维护,不易分工合作
- 优点
- 微服务架构(马丁弗勒):将业务功能拆分成为一个一个的模块,模块与模块可以自由组合成为一个应用
- 节省调用资源
- 每个功能元素的服务都是可替换的,可独立升级
第一个SpringBoot
- 官网创建一个SpringBoot项目然后导入IDEA( Spring Initializr )
- IDEA创建一个SpringBoot项目(本质,通过网站创建的)
结构介绍
- 主启动类
- 项目源数据信息:创建时候输入的Project Metadata部分,也就是Maven项目的基本元素,包括:groupid、artifactid、version、name、description等
- parent:继承
spring-boot-starter-parent
的依赖管理,控制版本与打包等内容 - dependencies:项目的具体依赖,
- build:构建配置部分,默认使用了
spring-boot-maven-plugin
,配合spring-boot-starter-parent
就可以把springBooot应用打包成jar运行
基本操作
- *Application.java统计目录下创建包
- 自定义banner
- resource目录下,新建banner.txt
基本原理
-
基本配置
- pom.xml
- spring-boot-dependencies:核心依赖都在父工程中,
- 引入依赖的时候不需要指定版本就是因为有这个版本仓库进行管理
- 启动器
- 启动器:springboot的启动场景
- 编写了spring-boot-starter-web就会自动导入web环境所有的依赖
- springboot将所有的功能场景都变成了一个一个的启动器(父工程中管理了的依赖都可以直接启动)
- 使用功能时直接开启启动就可以了
- 主程序:
- 注解与方法
- pom.xml
-
总结:
springboot所有自动配置都是在启动的时候扫描加载并加载的,spring.factories所有的自动配置类都在这里面,但是不一定生效,要判断条件是否成立,只要导入了对应的starter,就有对应的启动器了,自动配置就会生效,然后配置成功。
- springboot在启动的时候,从类路径下/META-INF/spring.factories获取指定的值
- 将这些自动配置的类导入容器,自动配置就会生效,进行自动配置额
- 以前需要手动配置的东西,现在springboot进行配置
- 整个JaveEE,解决方案和自动配置的东西都在spring-boot-autoconfigure-2.2.0.RELEASE.jar这个包下
- springboot会将所有需要导入的组件已类名的形式返回,这些组件就会被添加到容器中
- 容器中也会存在很多的xxxAutoConfiguration的文件(@Bean),就是这些类给容器中导入了这个场景需要的所有组件,并自动配置
- 有了自动配置,就简化了手动配置的工作。
-
run方法做了哪些事情
-
推断应用的类型是普通项目还是Web项目
-
查找并加载所有可用初始化器,设置到initializers属性中
-
找出所有的应用程序监听器,设置到listeners属性中
-
推断并设置main方法的定义类,找到运行的主类
-
-
配置文件
-
名称固定application
-
application.properties
- 语法结构 key=value
-
application.yml
- 语法结构 key=空格value
-
作用:修改springboot的默认配置
-
yaml配置文件的强大之处
-
直接给实体类进行赋值(@ConfigurationProperties(prefix=""))
-
properties也可以进行赋值,只是更繁琐一些(@PropertySource(value="classpath:***.properties")@Value("${name}")//写在属性上)
-
基本语法
# 映射实体类属性 person: name: haha${random.uuid} age: 12 birth: 2021/09/01 happy: true maps: {aaa: ccc,bbb: qqq} lists: - haha - object dog: name: ${person.hello:hello_}白虎 age: 20
-
SJR303数据校验:
-
-
-
配置文件生效的位置:
-
优先级按照1234排序
-
-
多环境配置
# 生效配置 spring: profiles: active: dev
-
debug: true # 可以查看哪些配置类生效了,没有生效
-
自动配置原理
- SpringBoot启动会加载大量的自动配置类
- 查看需要使用的功能在SpringBoot默认写好的自动配置类中是否存在
- 查看自动配置类中配置了哪些组件,若要使用的组件存在,则不进行手动配置了
- 给容器中自动配置类添加组件的时候,会从properties类中获取某些属性,在配置文件中(application.yaml)可以执行属性的值
- xxxxAutoConfiguration:自动配置类,给容器中添加组件
- xxxxProperties:封装配置文件中相关属性
web开发
- 导入静态资源
- 首页定制
- jsp、模板引擎Thymeleaf
- 装配扩展SpringMVC
- 增删改查
- 拦截器
- 国际化
导入静态资源
- 什么是webjars
- 以maven的形式导入静态资源文件
- 用jar包的形式进行了一次封装,本质还是静态资源文件
- 访问路径http://localhost:8080/webjars/
- 可以存放静态资源的路径
- classpath:/META-INF/resources/
- classpath:/resources/
- classpath:/static/
- classpath:/public/
- 优先级resources > static > public
- 访问路径http://localhost:8080/
定制首页
-
在public或者static或者resources下编写页面index.html,名称固定
-
也可以放到templates下,templates中的资源只能通过Controller跳转进行访问,需要开启模板引擎
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
thymeleaf语法
- 引入命名空间
xmlns:th="http://www.thymeleaf.org"
- 使用thymeleaf语法取出model中的值
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div th:text="${msg}"></div>
<div th:utext="${msgLable}"></div>
<h3 th:each="user:${msgLable}" th:text="${user}"></h3>
<h3 th:each="user:${list}">[[${user}]]</h3>
</body>
</html>
SpringMVC扩展
@Configuration
public class MyMVCConfiguration implements WebMvcConfigurer {
//控制视图跳转
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/hello").setViewName("test");
}
}
- static下的静态资源有时候不能进行访问,需要maven 进行clean,浏览器也需要进行缓存清理