2020 12 14 浅谈 Spring Boot

概述

什么是Spring Boot?

Spring Boot 是Spring 开源组织下的子项目,是Spring 组件一站式解决方案,主要是简化了使用Spring 的难度,简省了各种启动器,开发者能快速上手。

Spring Boot有哪些优点?

  1. 容易上手,提升开发效率,为Spring 开发提供一个更快、更广泛的入门体验
  2. 开箱即用,原理繁琐的配置。
  3. 提供了一系列大型项目通用的非业务性功能,例如:内嵌服务器、安全管理、运行数据监控、运行状况检查和外部化配置等
  4. 没有代码生成,也不需要XML配置
  5. 避免大量的Maven带入和各种版本冲突

Spring Boot的核心注解是哪个? 它主要由哪几个注解组成的?

启动类上面的注解是@SpringBootApplication,它也是Spring Boot的核心注解,主要组合包含了以下3个注解:
@SpringBootConfiguration:组合了@Configuration注解,实现配置文件的功能。

@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能:@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class} ).

@ComponentScan: Spring组件扫描

配置

什么是JavaConfig?

Spring JavaConfig 是 Spring 社区的产品,它提供了配置Spring IoC 容器的纯Java方法,因此它有助于避免使用XML配置。使用JavaConfig的优点在于:

  1. 面向对象的配置。 由于配置被定义为JavaConfig中的类,因此用户可以充分利用Java中的面向对象功能。一个配置类可以继承另一个,重写它的@Bean方法等。
  2. 减少或消除XML配置。 基于依赖注入原则的外化配置的好处已被证明,但是许多开发人员不希望再XML和Java之间来回切换。JavaConfig为开发人员提供了一种纯Java方法来配置与XML配置概念相似的Spring容器。从技术角度来讲,只是用JavaConfig配置类来配置容器是可行的,但是实际上很多人认为将JavaConfig与XML混合匹配是理想的。
  3. 类型安全和重构友好。 JavaConfig 提供了一种类型安全的方法来配置Spring 容器。有意Java5.0对泛型的支持,现在可以按类型而不是按名称检索bean,不需要任何强制转换或基于字符串的查找。

Spring Boot 自动配置原理是什么?

注解 @EnableAutoConfiguration,@Configuration,@ConditionalOnClass就是自动配置的核心, @EnableAutoConfiguration 给容器导入 META-INF/Spring.factories里定义的自动配置类。
@Configuration筛选有效的自动配置类。
@Conditional每一个自动配置类结合对应的xxxProperties.java 读取配置文件进行自动配置功能。

如何理解Spring Boot 配置加载顺序?

在Spring Boot 里面,可以使用以下几种方式来加载配置
1、properties文件;
2、YAML文件;
3、系统环境变量;
4、命令行参数;
等等。。。。

什么是YAML?

YAML是一种人类可读的数据序列化语言。它通常用于配置文件。与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML文件就更加结构化,而且更少混淆。可以看出YAML具有分层配置数据。

YAML配置的优势在哪里?

YAML现在可以算是非常流行的一种配置文件格式了。无论是前端还是后端,都可以见到YAML配置。那么YAML配置和传统的properties配置相比到底有哪些优势呢?

  1. 配置有序,在一些特殊的场景下,配置有序很关键
  2. 支持数组,数组中的元素可以是基本数据类型也可以是对象
  3. 简洁

相比properties配置文件,YAML还有一个缺点,就是不支持@PropertySource注解导入自定义的YAML配置

Spring Boot是否可以使用XML配置?

Spring Boot推荐使用Java配置而非XML配置,但是Spring Boot 中也可以使用XML配置,通过@ImportResource注解可以引入一个XML配置

Spring Boot核心配置文件时什么? bootstrap.properties和application.properties有何区别?

单纯做Spring Boot开发,可能不太容易遇到bootstrap.properties配置文件,但是在结合Spring Cloud时,这个配置就会经常遇到了,特别时需要加载一些远程配置文件的时候。

Spring Boot核心的两个配置文件:

  • bootstrap(.yml或者.properties):bootstrap 由父 ApplicationContext加载的,比 application 优先加载,配置在应用程序上下文的引导阶段生效。一般来说我们在Spring Cloud Config 或者Nacos 中会用到它。且bootstrap 里面的属性不能被覆盖;
  • application(.yml或者.properties):由ApplicationContext加载,用于Spring boot项目的自动化配置。

什么是 Spring Profiles?

Spring Profiles 允许用户根据配置文件(dev ,test,prod等)来注册bean。因此,当应用程序在开发中运行时,只有某些bean可以加载,而在PRODUCTION中,某些其他bean可以加载。假设我们的要求是 Swagger 文档仅适用于QA环境,并且禁用所有其他文档。这可以使用配置文件来完成。Spring Boot使得使用配置文件非常简单。

如何在自定义端口上运行Spring Boot应用程序?

为了在自定义端口上运行Spring Boot应用程序,可以在application.properties(.yml)中指定端口。
server.port=8081

安全

如何实现Spring Boot应用程序的安全性?

为了实现Spring Boot的安全性,我们使用 spring-boot-starter-security 依赖项,并且必须添加安全配置。它只需要很少的代码。配置类将必须扩展WebSecurityConfigurationAdaptor 并覆盖其方法

比较一下Spring Security 和Shiro 各种的优缺点?

由于Spring Boot 官方提供了大量的非常方便的开箱即用的Starter,包括 Spring Security的Starter,使得在Spring Boot 中使用Spring Security 变得更加容易,甚至只需要添加一个依赖就可以保护所有的接口,所以,如果是Spring Boot项目,一般选择Spring Security。 当然这只是一个建议的组合,单纯从技术上来说,无论怎么组合,都是没有问题的。Shiro 和 Spring Security 相比,主要有以下一些特点:

  1. Spring Security 是一个重量级的安全管理框架;Shiro 则是一个轻量级的安全管理框架
  2. Spring Security 概念复杂,配置繁琐;Shiro 概念简单,配置简单
  3. Spring Security 功能强大;Shiro 功能简单

Spring Boot 中如何解决跨域问题?

跨域跨域在前端通过JSONP 来解决,但是JSONP只可以发送GET请求,无法发送其他类型的请求,在RESTful风格的应用中,就显得非常鸡肋,因此我们推荐在后端通过(CORS, Cross-origin-resource sharing)来解决跨域问题。这种解决方案并非Spring Boot特有的,在传统的SSM框架中,就可以通过CORS 来解决跨域问题,只不过之前我们是在XML中配置CORS,现在可以通过实现WebMvcConfigurer接口然后重写addCorsMappings 方法解决跨域问题。

CORS跨域配置

@Configuration
public class CorsConfig implements WebMvcConfigurer {
	
	@Override
	public void addCorsMappings(CorsRegistry registry){
		registry.addMapping("/**")
				.allowedOrigins("*")
				.allowCredentials(true)
				.allowedMethods("GET","POST","PUT","DELETE","OPTIONS")
				.maxAge(3600);
	}
}

项目中前后端分离部署,所以需要解决跨域问题。
我们使用cookie存放用户登录的信息,在Spring 拦截器进行权限控制,当权限不符合时,直接返回给用户固定的json结果。

当用户登录以后,正常使用;当用户退出登录状态时或者token过期时,由于拦截器和跨域的顺序有问题,出现了跨域的现象。

我们知道一个http请求,先走filter ,到达servlet后才进行拦截器的处理,如果我们把cors放在filter里,就跨域有限权限拦截器执行。

@Configuration
public class CorsConfig {
	
	@Bean
	public CorsFilter corsFilter() {
		CorsConfiguration cors = new CorsConfiguration();
		cors.addAllowedOrigin("*");
		cors.addAllowedHeader("*");
		cors.addAllowedMethod("*");
		cors.addAllowCredentials(true);
		UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource;
		urlBasedCorsConfigurationSource.registerCorsConfiguration("/**",cors);
		return new CorsFilter(urlBasedCorsConfigurationSource);
	}
}

什么是CSRF攻击?

CSRF 代表跨站请求伪造。这是一种攻击,迫使最终用户在当前通过身份验证的Web应用程序上执行不需要的操作。CSRF攻击专门针对状态改变请求,而不是数据窃取,因为攻击者无法查看对伪造请求的响应。

如何避免?

  • 验证HTTP Referer字段 HTTP头重的Referer字段记录了该HTTP请求的来源地址。在通常情况下,访问一个安全受限页面的请求来自于同一网站,而如果黑客要对其实施CSRF攻击,他一般只能在他自己的网站构造请求。因此,可以通过验证Referer值来防御CSRF攻击。
  • 使用验证码 关键操作页面加上验证码,后台收到请求后通过判断验证码可以防御CSRF。但是这种方法对用户不太友好。
  • 在请求地址中添加token并验证 CSRF攻击之所能够成,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于Cookie中,因此黑客可以在不知道这些验证信息的情况下直接利用用户字段的cookie来通过安全验证。要抵御CSRF,关键在于在请求中放入黑客锁不能伪造的信息,并且该信息不存在于cookie之中。可以在HTTP请求中以参数的形式加入一个随机产生的token,并在服务器端建立一个拦截器来验证此token,如果请求中没有token或者token内容不正确,则认为可能是CSRF攻击而拒绝该请求。这种方法要比检查Referer要安全一些,token可以在用户登录后产生并防御session之中,然后再每次请求时把token从session中拿出,与请求中的token进行比对,但这种方法的难点在于如何把token以参数的形式加入请求。 对于GET请求,token将附在请求地址之后,这样URL就变成了 http://url?csrftoken=tokenvalue.而对于Post请求来说,要在form的最后加上 ,这样就把token以参数形式加入请求了
  • 在HTTP头中自定义属性并验证 这种方法也是使用token 并且进行验证,和上一种方法不同的是,这里并不是把token以参数的形式置于HTTP请求之中,而是把它放到HTTP头中自定义的属性里。通过XMLHttpRequest这个类,可以一次性给所有该类请求加上csrftoken这个HTTP头属性,并把token值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。

什么是XSS攻击,如何避免?

XSS攻击又称CSS,全称Cross Site Script (跨站脚本攻击),其原理是攻击者向有XSS漏洞的网站中输入恶意的 HTML 代码,当用户浏览该网站时,这段 HTML 代码会自动执行,从而达到攻击的目的。XSS 攻击类似于 SQL 注入攻击,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制,获取用户的一些信息。 XSS是 Web 程序中常见的漏洞,XSS 属于被动式且用于客户端的攻击方式。

XSS防范的总体思路是:对输入(和URL参数)进行过滤,对输出进行编码。

监视器

Spring Boot 中的监视器是什么?

Spring boot actuator 是Spring 启动框架中的重要功能之一。Spring boot 监视器可以帮助您访问生产环境中正在运行的应用程序的当前状态。有几个指标必须在生产环境中进行检查和监控。即使一些外部应用程序可能正在使用这些服务来向相关人员触发警报消息。监视器模块公开了一组可直接作为HTTP URL 访问的REST 端点来检查状态。

如何在Spring Boot 中禁用Actuator 端点安全性?

默认情况下,所有敏感的HTTP端点都是安全的,只有具有ACTUATOR 角色的用户才能访问它们。安全性是使用标准的HttpServletRequest .isUserInRole 方法实施的。我们可以使用来禁用安全性。只有在执行机构端点在防火墙后访问时,才建议禁用安全性。

我们如何监视所有Spring Boot 微服务?

Spring Boot 提供监视器端点以监控各个微服务的度量。这些端点对于获取有关应用程序的信息以及它们的组件()如数据库等 是否正常运行很有帮助。但是,使用监视器的一个主要缺点或困难是,我们必须单独打开应用程序的知识点以了解其状态或健康状态。想象一下涉及50个应用程序的微服务,管理员将不得不击中所有50个应用程序的执行终端。为了帮助我们处理这种情况,我们将使用位于的开源项目。它建立在Spring Boot Actuator 之上,它提供了一个Web UI 使我们能够可视化多个应用程序的度量。

整合第三方项目

什么是WebSockets?

WebSockets 是一种计算机通信协议,通过单个TCP连接提供全双工通信信道。

  1. WebSockets 是双向的-使用WebSocket 客户端或服务器可以发起消息发送
  2. WebSockets 是全双工的- 客户端和服务器通信时相互独立的
  3. 单个TCP连接-初始连接使用HTTP,然后将此连接升级到基于套接字的连接。然后这个单一连接用于所有未来的通信
  4. Light 与 http相比,WebSocket 消息数据交换要轻得多

什么是Spring Data?

Spring Data 是Spring 的一个子项目。用于简化数据库访问,支持NoSql和关系数据存储。其主要目标是使数据库的访问变得方便快捷。Spring Data 具有如下特点:

SpringData 项目支持NoSql存储:

  1. MongoDB (文档数据库)
  2. Neo4j(图形数据库)
  3. Redis(键值对存储)
  4. Hbase(列族数据库)

SpringData 项目所支持的关系数据存储技术:

  1. JDBC
  2. JPA

Spring Data Jpa 致力于减少数据访问层(DAO)的开发量,开发者唯一要做的,就是声明持久层的接口,其他都交给Spring Data JPA 来帮你完成! Spring Data JPA 通过规范方法的名字,根据符合规范的名字来确定方法需要实现什么样的逻辑。

什么是 Spring Batch?

Spring Boot Batch 提供可重用的函数,这些函数在处理大量记录时非常重要,包括日志/跟踪,事务管理,作业处理统级信息,作业重新启动,跳过和资源管理。它还提供了更先进的技术服务和功能,通过优化和分区技术,可以实现极高批量和高性能批处理作业。简单以及复杂的大批量批处理作业可以高度可扩展的方式利用框架处理重要大量的信息。

什么是FreeMarker模板?

FreeMarker是一个基于Java的模板引擎,最初专注于使用MVC软件架构进行动态网页生成。使用Freemaker的主要优点是表示层和业务层的完全分离。程序员可以处理应用程序代码,而设计人员可以处理html页面设计。最后使用freemaker可以将这些结合起来,给出最终的输出页面。

如何集成Spring Boot 和ActiveMQ?

对于集成Spring Boot 和ActiveMQ,我们使用依赖关系。它只需要很少的配置,并且不需要样板代码。

什么是Apache Kafka?

Apache Kafka 是一个分布式发布-订阅消息系统。它是一个可扩展的,容错的发布-订阅消息系统,它使我们能够构建分布式应用程序。这是一个Apache顶级项目。Kafka适合离线和在线消息消费。

什么是Swagger?你用Spring Boot实现了它吗?

Swagger 广泛用于可视化API,使用Swagger UI为前端开发人员提供在线沙箱。Swagger 是用于生成 RESTful Web 服务的可视化表示的工具,规范和完整框架实现。它是哟个文档能够以与服务器相同的速度更新。当通过Swagger 正确定义时,消费者可以使用最少量的实现逻辑来理解远程服务并与其进行交互。因此,Swagger消除了调用服务时的猜测。

前后端分离,如何维护接口文档?

前后端分离开发日益流行,大部分情况下,我们都是通过Spring Boot 做前后端分离开发,前后端分离一定会有接口文档,不然会前后端会深深陷入到扯皮中。一个比较笨的方法就是使用word或者md来维护接口文档,但是效率太低,接口一变,所有人受伤的文档都得变。在Spring Boot中,这个问题常见的解决方案是Swagger,使用Swagger 我们可以快速生成一个接口文档网站,接口一旦发生变化,文档就会自动更新,所有开发工程师访问这一个在线网站就可以获取到最小的接口文档,非常方便。

其他

如何重新加载Spring Boot上的更改,而无需重新启动服务器?Spring Boot项目如何热部署?

这可以使用DEV工具来实现。通过这种依赖关系,您可以节省任何更改,嵌入式tomcat将重新启动。Spring Boot有一个开发工具(Dev Tools)模块,它有助于提高开发人员的生产力。Java开发人员面临的一个主要挑战是将文件更改自动部署到服务器并自动重启服务器。开发人员可以重新加载Spring Boot上的更改,而无需重新启动服务器。这将消除每次手动部署更改的需要。Spring Boot在发布它的第一个版本时没有这个功能。这是开发人员最需要的功能。DevTools模块完全满足开发人员的需求。该模块将在生产环境中被禁用。它还提供H2数据库控制台以更好地测试应用程序。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
</dependency>

您使用了哪些 starter maven 依赖项?

使用了下面的一些依赖项:
spring-boot-starter-activemq

spring-boot-starter-security

这有助于增加更少的依赖关系,并减少版本的冲突

Spring Boot中的starter 到底是什么?

首先,这个starter 并非什么新的技术点,基本上还是基于Spring 已有功能来实现的。首先它提供了一个自动化配置类,一般命名为xxxAutoConfiguration,在这个配置类中通过条件注解来决定一个配置是否生效(条件注解就是Spring中原本就有的),然后它还会提供一些列的默认配置,也允许开发者根据实际情况自定义相关配置。正因为如此,很多第三方框架,我们只需要引入依赖就可以直接使用了。当然,开发者也可以自定义starter

spring-boot-starter-parent有什么用?

我们都知道,新创建一个Spring Boot项目,默认都是有parent的,这个parent就是spring-boot-starter-parent,主要作用如下:

  1. 定义了Java编译版本为1.8
  2. 使用UTF-8格式编码
  3. 继承自spring-boot-depandenceies,这个里面敌营了依赖的版本,也正是因为继承了这个依赖,所以我们在写依赖时才不需要写版本号。
  4. 执行打包操作的配置。
  5. 自动化的资源过滤。
  6. 自动化的插件配置。
  7. 针对application.properties 和 application.yml的资源过滤,包括通过profile定义的不同环境的配置文件,例如application-dev.properties和application-dev.yml。

Spring Boot打成的jar 和普通的jar 有什么区别?

Spring Boot 项目最终打包成的jar 是可执行jar,这种jar 可以直接通过 java -jar xxx.jar 命令来运行,这种jar 不可以作为普通的jar被其他项目依赖,即使依赖了也无法使用其中的类。

Spring Boot 的 jar 无法被其项目依赖,主要还是他和普通的jar 的结构不同。普通的jar包,解压后直接就是包名,包里就是我们的代码,而Spring Boot 打包成的可执行jar 解压后,在 \BOOT-INF\classes目录下才是我们的代码,因此无法被直接引用。如果非要引用,可以在pom.xml文件中增加配置,将Spring Boot 项目打包成两个jar ,一个可执行,一个可引用。

运行Spring Boot 有哪几种方式?

  1. 打包用命令或者放到容器中运行
  2. 用Maven / Gradle 插件运行
  3. 直接执行 main 方法运行

Spring Boot 需要独立的容器运行吗?

可以不需要,内置了Tomcat / jetty 等容器

开启 Spring Boot 特性有哪几种方式?

1)继承spring-boot-starter-parent项目

2)导入spring-boot-dependencies项目依赖

如何使用 Spring Boot 实现异常处理?

Spring 提供了一种使用 ControllerAdvice 处理异常的非常有用的方法。 我们通过实现一个 ControlerAdvice 类,来处理控制器类抛出的所有异常。

如何使用 Spring Boot 实现分页和排序?

使用 Spring Boot 实现分页非常简单。使用 Spring Data-JPA 可以实现将可分页的传递给存储库方法。

微服务中如何实现 session 共享 ?

在微服务中,一个完整的项目被拆分成多个不相同的独立的服务,各个服务独立部署在不同的服务器上,各自的 session 被从物理空间上隔离开了,但是经常,我们需要在不同微服务之间共享 session ,常见的方案就是 Spring Session + Redis 来实现 session 共享。将所有微服务的 session 统一保存在 Redis 上,当各个微服务对 session 有相关的读写操作时,都去操作 Redis 上的 session 。这样就实现了 session 共享,Spring Session 基于 Spring 中的代理过滤器实现,使得 session 的同步操作对开发人员而言是透明的,非常简便。

Spring Boot 中如何实现定时任务 ?

定时任务也是一个常见的需求,Spring Boot 中对于定时任务的支持主要还是来自 Spring 框架。

在 Spring Boot 中使用定时任务主要有两种不同的方式,一个就是使用 Spring 中的 @Scheduled 注解,另一个则是使用第三方框架 Quartz。

使用 Spring 中的 @Scheduled 的方式主要通过 @Scheduled 注解来实现。

使用 Quartz ,则按照 Quartz 的方式,定义 Job 和 Trigger 即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值