什么是 Spring Boot?
Spring Boot 是 Spring 开源组织下的⼦项⽬,是 Spring 组件⼀站式解决⽅案,主要是简化了使⽤ Spring 的难度,约定⼤于配置,简化了繁重的配置,提供了各种启动器,开发者能快速上⼿。很容易就能创建⼀个独⽴的,产品级别的应⽤。背景:
J2EE笨重的开发、繁多的配置、低下的开发效率、复杂的部署流程、第三⽅技术集成难度⼤。
Spring Boot的优点:
开箱即⽤,远离繁琐的配置。因为它⽆需配置XML,也⽆代码⽣成器⽣成代码,spring内置了⾮常多的 API, 只需要在配置⽂件中打开不同的开关即可触发不同的⾃动配置类。所以它容易上⼿,能够提升开发效率,为 Spring 开发提供⼀个更快、更⼴泛的⼊门体验。快速创建独⽴运⾏的Spring项⽬以及与主流框架集成
使⽤嵌⼊式的Servlet容器,应⽤⽆需打成WAR包,这样可以更加轻松地开发和测试web应⽤程序。⽐如Tomcat就是⼀个Servlet容器,以前需要将项⽬打包成war包,放到tomcat中运⾏,现在可以不需要tomcat运⾏环境,仅需打包成⼀个Jar包,Jar包中内置了⼀个运⾏环境,使⽤Java -jar的命令就可以运⾏。
starters ⾃动依赖与默认版本控制,可以避免⼤量的 Maven 导⼊和各种版本冲突。
提供了⼀系列⼤型项⽬通⽤的⾮业务性功能,例如:内嵌服务器、安全管理、运⾏数据监控、运⾏状况检查和外部化配置等。
Spring Boot 的核⼼注解是哪个?它主要由哪⼏个注解组成的?
启动类上⾯的注解是@SpringBootApplication,它也是 Spring Boot 的核⼼注解,主要组合包含了以下 3 个注解:@SpringBootConfiguration:组合了 @Configuration 注解,实现配置⽂件的功能。
@EnableAutoConfiguration:打开⾃动配置的功能,也可以关闭某个⾃动配置的选项,如关闭数据源⾃动配置功能:@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。@ComponentScan:Spring组件扫描。
Spring Boot ⾃动配置原理是什么?
注解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass 就是⾃动配置的核⼼,@EnableAutoConfiguration 给容器导⼊META-INF/spring.factories ⾥定义的⾃动配置类。筛选有效的⾃动配置类。
Spring Boot中存现⼤量的 xxxAutoConfiguration 类,结合对应的 xxxProperties.java 读取配置⽂件进⾏⾃动配置功能。我们在配置⽂件中打开相应的开关,Spring Boot就会将这个这个场景需要的所有组件都注册到容器中,并配置好。
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):boostrap 由⽗ ApplicationContext 加载的,⽐ applicaton 优先加载,配置在应⽤程序上下⽂的引导阶段⽣效。⼀般来说我们在 Spring Cloud Config 或者 Nacos(是阿⾥巴巴开源的⼀款集服务发现+配置中⼼组件) 中会⽤到它。且 boostrap ⾥⾯的属性不能被覆盖;
application (. yml 或者 . properties): 由ApplicatonContext 加载,⽤于 spring boot 项⽬的⾃动化配置。
什么是 Spring Profiles?
Spring Profiles 允许⽤户根据配置⽂件(dev,test,prod 等)来注册 bean。因此,当应⽤程序在开发中运⾏时,只有某些 bean 可以加载,⽽在 PRODUCTION中,某些其他 bean 可以加载。假设我们的要求是 (OpenApi的前⾝,是⼀个书写API⽂档的规范)⽂档仅适⽤于 QA 环境,并且禁⽤所有其他⽂档。这可以使⽤配置⽂件来完成。Spring Boot 使得使⽤配置⽂件⾮常简单。
如何在⾃定义端⼝上运⾏ Spring Boot 应⽤程序?
为了在⾃定义端⼝上运⾏ Spring Boot 应⽤程序,您可以在application.properties 中指定端⼝。server.port = 8090
安全
如何实现 Spring Boot 应⽤程序的安全性?
为了实现 Spring Boot 的安全性,我们使⽤ spring-boot-starter-security 依赖项,并且必须添加安全配置。它只需要很少的代码。配置类将必须扩展WebSecurityConfigurerAdapter 并覆盖其⽅法。
⽐较⼀下 Spring Security 和 Shiro 各⾃的优缺点 ?
由于 Spring Boot 官⽅提供了⼤量的⾮常⽅便的开箱即⽤的 Starter ,包括 Spring Security 的 Starter ,使得在 Spring Boot 中使⽤Spring Security 变得更加容易,甚⾄只需要添加⼀个依赖就可以保护所有的接⼝,所以,如果是 Spring Boot 项⽬,⼀般选择 SpringSecurity 。当然这只是⼀个建议的组合,单纯从技术上来说,⽆论怎么组合,都是没有问题的。Shiro 和 Spring Security 相⽐,主要有如下⼀些特点:
1. Spring Security 是⼀个重量级的安全管理框架;Shiro 则是⼀个轻量级的安全管理框架2. Spring Security 概念复杂,配置繁琐;Shiro 概念简单、配置简单3. Spring Security 功能强⼤;Shiro 功能简单
注:Apache Shiro是⼀个强⼤且易⽤的Java安全框架,执⾏⾝份验证、授权、密码和会话管理
什么是 CSRF 攻击?
跨站请求伪造(Cross-site request forgery,CSRF),是攻击者通过⼀些技术⼿段欺骗⽤户的浏览器去访问⼀个⾃⼰曾经认证过的⽹站并执⾏⼀些操作(如发邮件,发消息,甚⾄财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的⽹站会认为是真正的⽤户操作⽽去执⾏。通俗的说就是攻击者⾃⼰写了⼀个⽹页,在这个⽹页的各个组件中都加了对某个银⾏账户进⾏转账或者购物⽹站进⾏消费的请求脚本,这样只要⽤户进⼊攻击者写的⽹页并点击任何⼀个组件,如果⽤户刚好在不久前访问过组件中伪造的⽬标请求⽹站,这样⼀旦这个组件被点击,就会向⽬标⽹站发起⼀个请求,这个请求就会被成功的伪造,从⽽让⽤户损失⼀些钱财。
防范⼿段
1、 检查 Referer ⾸部字段
Referer ⾸部字段位于 HTTP 报⽂中,⽤于标识请求来源的地址。服务器会检查这个⾸部字段并要求请求来源的地址在同⼀个域名下,可以极⼤的防⽌ CSRF 攻击。
这种办法简单易⾏,⼯作量低,仅需要在关键访问处增加⼀步校验。但这种办法也有其局限性,因其完全依赖浏览器发送正确的 Referer 字段。虽然 HTTP 协议对此字段的内容有明确的规定,但并⽆法保证来访的浏览器的具体实现,亦⽆法保证浏览器没有安全漏洞影响到此字段。并且也存在攻击者攻击某些浏览器,篡改其 Referer 字段的可能。
2、添加校验 Token(Spring Security采⽤的⽅式)
在访问敏感数据请求时,要求⽤户浏览器提供不保存在 Cookie 中,并且攻击者⽆法伪造的数据作为校验。例如服务器⽣成随机数并附加在表单的hidden标签中,并要求客户端回传这个随机数。如果是异步请求,需要在页⾯通过标签把token传递给⽤来处理异步请求的 js。
3、输⼊验证码
因为 CSRF 攻击是在⽤户⽆意识的情况下发⽣的,所以要求⽤户输⼊验证码可以让⽤户知道⾃⼰正在做的操作
Spring Boot 中的监视器是什么
因为SpringBoot简单配置即可使⽤,对底层封装的⽐较严实,所以发现错误不太好找bug。所以我们需要监控项⽬的某些状态信息来⽅便找bug。Spring Boot提供您的项⽬监控组件是Spring Boot Actuator。
- Endpoints:监控应⽤的⼊⼝,Spring Boot内置很多端点,通过@EndPoints()注解即可⾃定义端点 - 监控⽅式:HTTP 或者 JMX
- 访问路径:例如:\"/actuator/health\"
- 注意事项:按需配置暴露的端点(⼀共20多个端点)、需要通过Spring Security对所有端点进⾏权限控制,只有管理员可以访问,否则任何⼈都可以访问底层的代码,很不安全。
⽐如下⾯定义了⼀个id为 \"database\"的端点,⽤户只要⽤ 项⽬名+/actuator/database即可访问这个项⽬的数据库连接转态信息
什么是 Spring Data ?
Spring Data 是 Spring 的⼀个⼦项⽬。⽤于简化数据库访问,⽀持NoSQL 和 关系数据存储。其主要⽬标是使数据库的访问变得⽅便快捷。Spring Data 具有如下特点:SpringData 项⽬⽀持 NoSQL 存储:1. MongoDB (⽂档数据库)2. Neo4j(图形数据库)3. Redis(键/值存储)4. Hbase(列族数据库)5. Elasticsearch
SpringData 项⽬所⽀持的关系数据存储技术:
1. JDBC
2. JPA(Java Persistence API的简称,中⽂名Java持久层API)
Spring Data Jpa 致⼒于减少数据访问层 (DAO) 的开发量. 开发者唯⼀要做的,就是声明持久层的接⼝,其他都交给 Spring Data JPA 来帮你完成!Spring Data JPA 通过规范⽅法的名字,根据符合规范的名字来确定⽅法需要实现什么样的逻辑。
什么是 Apache Kafka?
Apache Kafka 是⼀个分布式发布 - 订阅消息系统。它是⼀个可扩展的,容错的发布 - 订阅消息系统,它使我们能够构建分布式应⽤程序。这是⼀个 Apache 顶级项⽬。Kafka 适合离线和在线消息消费。
什么是 Swagger?你⽤ Spring Boot 实现了它吗?
Swagger ⼴泛⽤于可视化 API,使⽤ Swagger UI 为前端开发⼈员提供在线沙箱。Swagger 是⽤于⽣成 RESTful Web 服务的可视化表⽰的⼯具,规范和完整框架实现。它使⽂档能够以与服务器相同的速度更新。当通过 Swagger 正确定义时,消费者可以使⽤最少量的实现逻辑来理解远程服务并与其进⾏交互。因此,Swagger消除了调⽤服务时的猜测。注:
沙箱技术即是⼀bai个虚du拟系统程序,zhi允许你在沙盘环dao境中运⾏浏览器或其他zhuan程序,因此运⾏所产shu⽣的变化可以随后删
除。它创造了⼀个类似沙盒的独⽴作业环境,在其内部运⾏的程序并不能对硬盘产⽣永久性的影响。其为⼀个独⽴的虚拟环境,可以⽤来测试不受信任的应⽤程序或上⽹⾏为。
沙箱是⼀种按照安全策略程序⾏为的执⾏环境。早期主要⽤于测试可疑软件等,⽐如⿊客们为了试⽤某种病毒或者不安全产品,往往可以将它们在沙箱环境中运⾏。
前后端分离,如何维护接⼝⽂档 ?
前后端分离开发⽇益流⾏,⼤部分情况下,我们都是通过 Spring Boot 做前后端分离开发,前后端分离⼀定会有接⼝⽂档,不然会前后端会深深陷⼊到扯⽪中。⼀个⽐较笨的⽅法就是使⽤ word 或者 md 来维护接⼝⽂档,但是效率太低,接⼝⼀变,所有⼈⼿上的⽂档都得变。在Spring Boot 中,这个问题常见的解决⽅案是 Swagger ,使⽤ Swagger 我们可以快速⽣成⼀个接⼝⽂档⽹站,接⼝⼀旦发⽣变化,⽂档就会⾃动更新,所有开发⼯程师访问这⼀个在线⽹站就可以获取到最新的接⼝⽂档,⾮常⽅便。
Spring Boot 打成的 jar 和普通的 jar 有什么区别 ?
Spring Boot 项⽬最终打包成的 jar 是可执⾏ jar ,这种 jar 可以直接通过 java -jar xxx.jar 命令来在内置Servlet容器中运⾏,这种 jar 不可以作为普通的 jar 被其他项⽬依赖,即使依赖了也⽆法使⽤其中的类。
Spring Boot 的 jar ⽆法被其他项⽬依赖,主要还是他和普通 jar 的结构不同。普通的 jar 包,解压后直接就是包名,包⾥就是我们的代码,⽽ Spring Boot 打包成的可执⾏ jar 解压后,在 \\BOOT-INF\\classes ⽬录下才是我们的代码,因此⽆法被直接引⽤。如果⾮要引⽤,可以在pom.xml ⽂件中增加配置,将 Spring Boot 项⽬打包成两个 jar ,⼀个可执⾏,⼀个可引⽤。
如何使⽤ Spring Boot 实现异常处理?
通过@ControllerAdvice、@ExceptionHandler、@ModelAttribute、@DataBinder 4个注解来统⼀处理控制器类抛出的所有异常。@ControllerAdvice:⽤于修饰类,表⽰该类是Controller的全局配置类。
在此类中,可以对Controller进⾏如下三种全局配置:异常处理⽅案、绑定数据⽅案、绑定参数⽅案。
@ExceptionHandler(异常处理⽅案):⽤于修饰⽅法,该⽅法会在Controller出现异常后被调⽤,⽤于处理捕获到的异常。 @ModelAttribute(绑定数据⽅案):⽤于修饰⽅法,该⽅法会在Controller⽅法执⾏前被调⽤,⽤于为Model对象绑定参数。 @DataBinder(绑定参数⽅案): ⽤于修饰⽅法,该⽅法会在Controller⽅法执⾏前被调⽤,⽤于绑定参数的转换器。
Spring Boot 中如何实现定时任务 ?
在 Spring Boot 中使⽤定时任务主要有两种不同的⽅式,⼀个就是使⽤ Spring 中的 @Scheduled 注解,这个注解使⽤的是ThreadPoolTaskScheduler来实现的。在需要定时执⾏的⽅法上加上 @Scheduled 注解来实现。编码简单。另⼀个则是使⽤第三⽅框架 Quartz。实现过程中需要按照 Quartz 的⽅式,定义 Job 和 Trigger。编码复杂。
其中@Scheduled⽅式在分布式环境中会有重复执⾏的问题,但是Quartz在分布式环境中没问题,因为Quartz会创建专有数据库,如果发现数据库中有相同任务在执⾏会放弃执⾏当前任务,这样任务就不会被重复执⾏。
参考:
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- sceh.cn 版权所有 湘ICP备2023017654号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务