概念:
Spring Boot是Spring组织下的子项目,用于简化Spring应用初始框架搭建以及开发过程;
是一个简单javaweb框架,具有简化开发、约定大于配置的优点。
核心 :
= 定义了特定的方式进行配置,不需要开发人员定义样板化的配置;
只要存在对应的jar包,Spring就会自动配置;
理解:
并不是新的框架,类比Maven,Maven整合了所有的jar包,SpringBoot整合了所有框架;
扩展
jar = 一种软件包的格式,用于聚合大量的Java类文件、相关的元数据和资源文件到一个文件,以便于Java平台的应用;
自动配置的理解要从应用出发,SpringBoot需要两个配置文件:application.properties和Pom.xml
SpringBoot的启动过程:
涉及到的注解:SpringBootApplication、SpringBootConfiguration、ConponentScan、EnableAutoConfiguration;
理解起来有点困难:
具体代码执行过程:
代码的启动类文件中有核心注解SpringBootApplication,main方法中有SpringApplication.run方法执行;
进入SpringApplication类中,有prepareContext完成自动装配,点击进入prepareContext,最终会找到load方法;
load方法内,创建BeanDefinitionLoader定义bean对象的加载器,完成这些对象的加载和注入功能;
而prepareContext的load方法最终执行的是BeanDefinitionLoader中的load方法,将加载入的对象进行一系列的识别,看是否可以将注解的标识加载回来;接下来判断资源类型,看使用groovy或者注解加载;
寻找启动类是否有@Component,通过SpringBootApplication→SpringBootConfiguration→Configuration→Conponent
isEligible方法,找到注解之后会把该对象注册到AnnotatedBeanDefinitionReader对象中;
以上内容内容启动对象的注入;
搭建简单,开箱即用:
不使用SpringBoot时候,要搭建一个Spring/SpringMVC项目,需要开放接口;要配置servlet;要使用IOC,得在xml里配置各种bean;要本地调试,得配置tomcat;
简化配置,专属编码:
SpringBoot可以根据当前类路径下的类、jar包来自动配置bean;
想使用异步化,加个@EnableAsync就可以开启异步化功能;想使用定时任务,加个@EnableScheduling就可以使用开启定时任务功能;
想使用AOP,加个@Aspect就可以各种拦截了;添加一个spring-boot-starter-web启动器就能拥有web的功能;
过程简单,配置过程无代码生成,无需XML配置文件;避免大量的Maven导入和各种版本冲突;
可独立运行:
Spring Boot 中内嵌了各种 servlet 容器、Tomcat、Jetty 等,现在不再需要打成war 包部署到容器中;
Spring Boot 只要打成一个可执行的 jar 包就能独立运行,所有的依赖包都在一个 jar 包内。
任何技术都会有缺点,能解决一切问题的技术不存在;
目前存在的缺点就是入门简单,强大的封装功能,使得学习者无法清楚理解内部原理。
Spring Boot的核心配置文件有 bootstrap.properties 和 application.properties;
两者的区别:
区别 | bootstrap.properties | application.properties |
---|---|---|
作用 | 在应用程序上下文的引导阶段生效,由父 ApplicationContext加载 主要用于从额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性 其中的属性不能被覆盖 | 由ApplicationContext加载 主要用于SpringBoot 自动化配置文件 |
加载顺序 | 先加载 | 后加载 |
Spring Boot 配置文件的格式有三种:.properties 、 .yml、.yaml
区别
案例:改端口号;
.properties
server.port = 80
.yml
server:
port:80
.yaml
server:
port:80
三个配置文件的优先级不同
properties > yml > yaml
启动类上面的注解@SpringBootApplication
由三个注解组成:
@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan。
@SpringBootConfiguration = 组合了@Configuration,实现配置文件;
@EnableAutoConfiguration = 打开自动配置的功能,也可以关闭某个自动配置的选项
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class });
@ComponentScan = 使spring Boot扫描到Configuration类,并把它加入到程序上下文。
有两种方式:
继承spring-boot-starter-parent项目
导入spring-boot-dependencies项目依赖
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
<version>2.1.5.RELEASEversion>
parent>
导入spring-boot-dependencies项目依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-dependenciesartifactId>
<version>1.5.6.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
概念:
基于Java配置的spring,提供了配置 Spring IoC 容器的纯Java 方法,使用JavaConfig可以替代XML;
优势:
面向对象配置
配置被定义为JavaConfig中的类,则一个配置就可以继承另一个,重写它的@Bean方法;
减小或消除XML配置
纯Java的方法来配置,与XML配置概念相似
类型安全和重构友好
JavaConfig 提供了一种类型安全的方法来配置Spring容器,由于Java 5.0 对泛型的支持,现在可以按类型而不是按名称检索bean,不需要任何强制转换或基于字符串的查找。
Spring 包含 Spring MVC ,Spring Boot又包含Spring。
启动应用 = 通过启动类;
SpringBoot内置了tomcat,通过启动类启动,配置也集中在application.yml中;
可以不需要,内置了 Tomcat /Jetty 等容器。
概念:
是一种人类可读的数据序列化语言,它通常用于配置文件。
与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML 文件就更加结构化,而且更少混淆,可以看出 YAML 具有分层配置数据。
要求:
写法是key: value(冒号后面有空格),对缩进严格要求,可以存储对象;
相比于传统的properties配置,YAML配置的优势是:
properties配置文件
yaml配置文件
可以使用XML配置,需要通过@ImportResource注解引入一个XML配置。
SpringBoot推荐使用Java配置。
概念:
配置文件,用于区分不同的环境,进而对不同环境进行配置。
不同的环境:
dev = 开发环境,用于开发者调试使用;
test = 测试环境;
pre = 灰度环境,比测试环境更真实,指小范围的生产环境,类似游戏的内测;
prod = 生产环境,正式线上环境;
SpringBoot应用程序默认的监听端口是:8080;
要想在自定义端口运行,需要在application.properties中进行配置:
server.port = xxxx
使用官方提供的spring-boot-starter-security依赖;
使用:
配置类必须扩展WebSecurityConfigurerAdapter 并覆盖其方法。
Spring Security
概念:基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,重量级框架;
缺点:概念复杂,配置繁琐;不能脱离spring;
优点:功能强大
Shiro
概念:Java的安全框架,轻量级框架;
优点:概念简单、配置简单
缺点:功能简单
介绍
两者都是安全框架,主要用于对访问权限进行控制,应用的安全性包括用户认证和用户授权;
用户认证 = 验证某个用户是否是合法用户;
用户授权 = 某个用户是否有权限执行某个操作;
跨域问题:
当前页面与被请求页面不是同源的,也就是两者之前协议、域名、端口其中一个不一致。
解决:
后端实现跨域的方式是CROS跨域(跨域资源共享 = Cross-origin resource sharing);SpringBoot中有两种形式。
介绍
当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域。
举例:
当前页面 | 被请求页面 | 是否跨域 | 原因 |
---|---|---|---|
http://www.test.com/ | http://www.test.com/index.html | 否 | 同源(协议、域名、端口号相同) |
http://www.test.com/ | https😕/www.test.com/index.html | 是 | 协议不相同(http/https) |
http://www.test.com/ | http://www.baidu.com | 是 | 主域名不同(test/baidu) |
http://www.test.com/ | http://blog.test.com | 是 | 子域名不同(www/blog) |
http://www.test.com:8080/ | http://www.test.com:7007/ | 是 | 端口号不同 |
概念:
CSRF,全称Cross-site request forgery,表示跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。
具体过程:
Spring boot actuator是spring启动框架中的重要功能之一。
可帮助用户访问生产环境中正在运行的应用程序的当前状态。
有几个指标必须在生产环境中进行检查和监控,即使一些外部应用程序可能正在使用这些服务来向相关人员触发警报消息。监视器模块公开了一组可直接作为HTTPURL访问的REST端点来检查状态。
默认情况下,所有敏感的HTTP端点都是安全的,只有具有ACTUATOR(actuator)角色的用户才能访问它们。
安全性是使用标准的HttpServletRequest.isUserInRole方法实施的。 我们可以使用management.security.enabled = false 来禁用安全性。只有在执行机构端点在防火墙后访问时,才建议禁用安全性。
Spring Boot 提供监视器端点以监控各个微服务的度量。
这些端点对于获取有关应用程序的信息(如它们是否已启动)以及它们的组件(如数据库等)是否正常运行很有帮助。
建立在 SpringBoot Actuator 之上,它提供了一个 Web UI,使我们能够可视化多个应用程序的度量。
概念:
WebSocket是一种计算机通信协议,通过单个TCP连接提供全双工通信信道,是Web应用程序中HTTP通信的替代方法。
实时应用程序;
特点:
WebSocket是双向的,使用 WebSocket 客户端或服务器可以发起消息发送;
WebSocket是全双工的,客户端和服务器通信是相互独立的;
单个TCP连接:初始连接使用 HTTP,然后将此连接升级到基于套接字的连接。然后这个单一连接用于所有客户端与服务器的通信;
Spring Data 是 Spring 的一个子项目,用于简化数据库访问,支持关系、非关系数据存储。
其主要目标是使数据库的访问变得方便快捷。
Spring Data JPA 致力于减少数据访问层(DAO)的开发量,开发者只需要声明持久层的接口就好。
SpringData支持关系存储的存储技术:JDBC、JPA;
Spring Batch 是一个轻量级的、完善的批处理框架;
提供可重用的函数,对处理日志、事务管理等非常重要;
通过优化的分区技术,实现高批量和高性能处理作业。
FreeMarker 是一个基于 Java 的模板引擎,最初专注于使用 MVC 软件架构进行动态网页生成。
Freemarker 的主要优点是表示层和业务层的完全分离。程序员可以设计应用程序代码,前端设计人员设计html代码,最后使用freemarker结合,输出最终页面;
ActiveMQ = 开源的,面向消息(MOM)的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。
通过在springboot项目的依赖pom中加依赖即可;
概念:
Swagger 是一个用于生成、描述和调用 RESTful 接口的 Web 服务。
Swagger 就是将项目中所有接口展现在页面上,并且可以进行接口调用和测试的服务。
作用:
将项目中所有的接口展现在页面上,这样后端程序员就不需要专门为前端使用者编写专门的接口文档;
当接口更新之后,只需要修改代码中的 Swagger 描述就可以实时生成新的接口文档了,从而规避了接口文档老旧不能使用的问题;
通过 Swagger 页面,我们可以直接进行接口调用,降低了项目开发阶段的调试成本。
采用SpringBoot实现前后端分离, 常见的解决方案是Swagger;
Swagger = 接口文档生成工具,同时提供接口测试调用的辅助功能;
使用Swagger可以快速生成一个接口文档网站,接口一发生变化,文档就会自动更新,所有开发工程师访问这一个在线网站就可以获取到最新的接口文档,非常方便。
概念:
SpringBoot 框架专门提供了进行热部署的依赖启动器,用于进行项目热部署,而无须开发人员手动重启项目。
开发过程中,由于对一段逻辑代码不断地修改测试,在修改之后往往需要重新启动服务,这些服务往往需要加载很久才能启动成功,这种重复操作就降低了程序开发效率。
具体操作:
概念:
新创建的SpringBoot项目会有这个 Spring-boot-starter-parent 依赖。
主要功能:
定义了 Java 编译版本为 1.8;
使用 UTF-8 格式编码;
继承自 spring-boot-dependencies,这里面定义了依赖的版本,后期导入依赖不需要版本号;
执行打包操作的配置;
自动化的资源过滤;
自动化的插件配置;
针对 application.properties 和 application.yml 的资源过滤,包括通过 profile 定义的不同环境的配置文件,
例如application-dev.properties 和 application-dev.yml。
SpringBoot默认打的jar包是可执行的jar,可以通过命令java -jar xxx.jar来运行;不能被其他项目依赖,因为它和普通的jar的结构不同;
普通的jar包,解压后直接就是包名,包里就是代码;SpringBoot打包成的可执行jar解压后,在\BOOT-INF\classes目录下才是书写的代码,因此无法直接引用;如果非要引用,可以在pom.xml文件中增加配置,将SpringBoot项目打包成两个jar,一个可执行,一个可引用。
Spring 提供了一种使用 ControllerAdvice 处理异常的方法,通过实现一个 ControllerAdvice 类,来处理控制器类抛出的所有异常。
使用 Spring Boot 实现分页非常简单。使用 Spring Data-JPA 可以实现将可分页org.springframework.data.domain.Pageable 传递给存储库方法。
Spring Session + Redis 来实现 session 共享。
理解:
在微服务中,一个完整的项目被拆分成多个不相同的独立的服务,各个服务独立部署在不同的服务器上,各自的 session 被从物理空间上隔离开,但是经常我们需要在不同微服务之间共享 session。将所有微服务的 session 统一保存在 Redis 上,当各个微服务对 session 有相关的读写操作时,都去操作 Redis 上的 session,这样就实现了session共享。
概念:
是一种架构,这种架构是将单个的整体应用程序分割成更小的项目关联的独立服务。
也就是应用必须构建成一系列小服务的组合,可以通过http方式进行通信。
通信方式:http 或者 rpc
理解:
将应用的每个功能都独立出来,将独立出来的功能元素进行动态组合;
微服务的架构是对功能进行复制,而不是对应用进行复制。
扩展
单体应用框架(all in one)= 将一个应用中的所有应用服务都封装在一个应用中;
把数据库访问、web访问等功能放到一个war包里面。
优点:易于开发和测试;部署方便,只需要将war复制多份即可,放到不同服务器上就可以。
实现方式: