SpringBoot常见⾯试题整理
⽬录
常见问题分析
什么是 Spring Boot?
“Spring Boot是由Pivotal团队提供的全新框架,是⼀个框架,⼀种全新的编程规范,其设计⽬的是⽤来简化新Spring应⽤的初始搭建以及开发过程。
Spring Boot 有哪些优点?
容易上⼿,提升开发效率,为 Spring 开发提供⼀个更快、更⼴泛的⼊门体验。
开箱即⽤,远离繁琐的配置。
提供了⼀系列⼤型项⽬通⽤的⾮业务性功能,例如:内嵌服务器、安全管理、运⾏数据监控、运⾏状况检查和外部化配置等。
没有代码⽣成,也不需要XML配置。
避免⼤量的 Maven 导⼊和各种版本冲突。
SpringBoot中常⽤的注解有哪些?
@SpringBootApplication 是启动类上⾯的注解,也是核⼼注解。
@SpringBootConfiguration:组合了 @Configuration 注解,实现配置⽂件的功能。
@EnableAutoConfiguration:打开⾃动配置的功能,也可以关闭某个⾃动配置的选项。
@ComponentScan:Spring组件扫描。
配置SpringBoot相关
什么是 JavaConfig?
Spring JavaConfig是Spring社区的产品,他提供了配置Spring IOC容器的纯Java⽅法。因此它有助于避免使⽤XML配置。使⽤JavaCofig的优点在于:
1.⾯向对象的配置。由于配置被定义为JavaConfig中的类,因此⽤户可以充分使⽤Java中的⾯向对象功能。⼀个配置类可以继承另⼀
个,重写它的@Bean⽅法等。
2.减少或者消除XML配置。基于依赖注⼊原则的外化配置的好处已经被证明。但是,许多开发⼈员不希望在XML和Java之间来回切
换。javaconfig为开发⼈员提供了⼀种纯Java的⽅法来配置与XML配置概念相似的Spring容器。从技术⾓度来说,只使⽤javaconfig 配置类来配置容器是可⾏的,但是实际开发中,很多场景都是javaconfig和xml配置共⽤是最⽅便,理想的。
3.类型安全和重构友好。javaconfig提供了⼀种类型安全的⽅法了来配置spring容器,由于Java5.0对泛型的⽀持,现在可以按类型⽽
不是名称检索bean,不需要任何的强制转换或者基于字符串的查。
Spring Boot ⾃动配置原理是什么?
SpringBoot启动的时候加载主配置类,开启了⾃动配置功能@EnableAutoConfiguration
@EnableAutoConfiguration利⽤EnableAutoConfigurationImportSelector给容器中导⼊⼀些组件,将 类路径下 META-INF/spring.factories ⾥⾯配置的所有EnableAutoConfiguration的值加⼊到了容中,每⼀个这样的 xxxAutoConfiguration类都是容器中的⼀个组件,都加⼊到容器中;⽤他们来做⾃动配置
你如何理解 Spring Boot 配置加载顺序?
在 Spring Boot ⾥⾯,可以使⽤以下⼏种⽅式来加载配置
1、properties⽂件;
2、YAML⽂件;
3、系统环境变量;
4、命令⾏参数;
什么是 YAML?
YAML是⼀种⼈类可读的数据序列化语⾔。它通常⽤于配置⽂件。与属性⽂件相⽐,如果我们想要在配置⽂件中添加复杂的属性,YAML⽂件就更加结构化,⽽且更少混淆。可以看出YAML具有分层配置数据。
YAML 配置的优势在哪⾥ ?
配置有序,在⼀些特殊的场景下,配置有序很关键
⽀持数组,数组中的元素可以是基本数据类型也可以是对象
内容简洁
相⽐ properties 配置⽂件,YAML 还有⼀个缺点,就是不⽀持 @PropertySource 注解导⼊⾃定义的 YAML 配置
Spring Boot 是否可以使⽤ XML 配置 ?
可以,Spring Boot 推荐使⽤ Java 配置⽽⾮ XML 配置,但是 Spring Boot 中也可以使⽤ XML 配置,通过 @ImportResource 注解可以引⼊⼀个 XML 配置。
spring boot 核⼼配置⽂件是什么?l和 application.properties 有何区别 ?
spring boot 核⼼的两个配置⽂件:
bootstrap (. yml 或者 . properties):boostrap 由⽗ ApplicationContext 加载的,⽐ applicaton 优先加载,配置在应⽤程序上下⽂的引导阶段⽣效。⼀般来说我们在 Spring Cloud Config 或者 Nacos 中会⽤到它。且 boostrap ⾥⾯的属性不能被覆盖;
application (. yml 或者 . properties): 由ApplicatonContext 加载,⽤于 spring boot 项⽬的⾃动化配置。
如何在⾃定义端⼝上运⾏ Spring Boot 应⽤程序?
为了在⾃定义端⼝上运⾏ Spring Boot 应⽤程序,您可以在application.properties 中指定端⼝。
安全相关问题
⽐较⼀下 Spring Security 和 Shiro 各⾃的优缺点 ?
由于 Spring Boot 官⽅提供了⼤量的⾮常⽅便的开箱即⽤的 Starter ,包括 Spring Security 的 Starter ,使得在 Spring Boot 中使⽤Spring Security 变得更加容易,甚⾄只需要添加⼀个依赖就可以保护所有的接⼝,所以,如果是 Spring Boot 项⽬,⼀般选择 Spring Security 。当然这只是⼀个建议的组合,单纯从技术上来说,⽆论怎么组合,都是没有问题的。Shiro 和 Spring Security 相⽐,主要有如下⼀些特点:
Spring Security 是⼀个重量级的安全管理框架;Shiro 则是⼀个轻量级的安全管理框架
Spring Security 概念复杂,配置繁琐;Shiro 概念简单、配置简单
Spring Security 功能强⼤;Shiro 功能简单
Spring Boot 中如何解决跨域问题 ?
跨域可以在前端通过 JSONP 来解决,但是 JSONP 只可以发送 GET 请求,⽆法发送其他类型的请求,在 RESTful 风格的应⽤中,就显得⾮常鸡肋,因此我们推荐在后端通过 (CORS,Cross-origin resource sharing) 来解决跨域问题。这种解决⽅案并⾮ Spring Boot 特有的,在传统的 SSM 框架中,就可以通过 CORS 来解决跨域问题,只不过之前我们是在 XML ⽂件中配置 CORS ,现在可以通过实现WebMvcConfigurer接⼝然后重写addCorsMappings⽅法解决跨域问题。
@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 corsConfiguration =new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.setAllowCredentials(true);
UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource =new UrlBasedCorsConfigurationSource();
return new CorsFilter(urlBasedCorsConfigurationSource);
}
}
什么是 CSRF 攻击?
CSRF 代表跨站请求伪造。这是⼀种攻击,迫使最终⽤户在当前通过⾝份验证的Web 应⽤程序上执⾏不需要的操作。CSRF 攻击专门针对状态改变请求,⽽不是数据窃取,因为攻击者⽆法查看对伪造请求的响应
SpringBoot问题补充
如何重新加载 Spring Boot 上的更改,⽽⽆需重新启动服务器?Spring Boot项⽬如何热部署?
这可以使⽤ DEV ⼯具来实现。通过这种依赖关系,您可以节省任何更改,嵌⼊式tomcat 将重新启动。Spring Boot 有⼀个开发⼯具(DevTools)模块,它有助于提⾼开发⼈员的⽣产⼒。Java 开发⼈员⾯临的⼀个主要挑战是将⽂件更改⾃动部署到服务器并⾃动重启服务器。开发⼈员可以重新加载 Spring Boot 上的更改,⽽⽆需重新启动服务器。这将消除每次⼿动部署更改的需要。Spring Boot 在
发布它的第⼀个版本时没有这个功能。这是开发⼈员最需要的功能。DevTools 模块完全满⾜开发⼈员的需求。该模块将在⽣产环境中被禁⽤。它还提供 H2 数据库控制台以更好地测试应⽤程序。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
spring-boot-starter-parent 有什么⽤ ?
我们都知道,新创建⼀个 Spring Boot 项⽬,默认都是有 parent 的,这个 parent 就是 spring-boot-starter-parent ,spring-boot-starter-parent 主要有如下作⽤:
定义了 Java 编译版本为 1.8 。
使⽤ UTF-8 格式编码。
继承⾃ spring-boot-dependencies,这个⾥边定义了依赖的版本,也正是因为继承了这个依赖,所以
我们 在写依赖时才不需要写版本号。
执⾏打包操作的配置。
⾃动化的资源过滤。
⾃动化的插件配置。
针对 application.properties 和 l 的资源过滤,包括通过 profile 定义的不同环境的配置⽂件,例如 application-dev.properties 和 l。
运⾏ Spring Boot 有哪⼏种⽅式?
1.打包⽤命令或者放到容器中运⾏
2.⽤ Maven/ Gradle 插件运⾏
3.直接执⾏ main ⽅法运⾏
Spring Boot 需要独⽴的容器运⾏吗?
不需要,⾥⾯内置Tomcat和Jetty 容器
微服务中如何实现 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 注解来实现。
spring ioc注解使⽤ Quartz ,则按照 Quartz 的⽅式,定义 Job 和 Trigger 即可。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论