Spring Boot 面试,一个问题就干趴下了!

  • 时间:
  • 浏览:4
  • 来源:QQ粉丝网_提供QQ猎鹰乐园技术_QQ思维国际资讯

随着 Spring Boot 使用没有广泛,Spring Boot 之后 成为 Java 守护进程池池员面试的知识点,好多好多 同学对 Spring Boot 理解完整性否是没有深刻,突然就会被几条连环跑给干趴下了!

比如下面这一 段的 Spring Boot 问答:

问:你人太好 Spring Boot 最大的优势是那先 呢?

答:Spring Boot 的最大的优势是“约定优于配置“。“约定优于配置“是两种 软件设计范式,开发人员按照约定的依据来进行编程,也能减少软件开发人员需做决定的数量,获得简单的好处,而又不失灵活性。

问:Spring Boot 中 “约定优于配置“的具体产品体现在哪里。

答:Spring Boot Starter、Spring Boot Jpa 完整性否是“约定优于配置“的两种 体现。完整性否是通过“约定优于配置“的设计思路来设计的,Spring Boot Starter 在启动的过程中会根据约定的信息对资源进行初始化;Spring Boot Jpa 通过约定的依据来自动生成 Sql ,避免少量无效代码编写。具体完整性也能参考:Spring Boot 为那先 没有火?

问:Spring Boot Starter 的工作原理是那先 ?

答:Spring Boot  在启动的时候会干这几件事情:

  1. Spring Boot 在启动否是去依赖的 Starter 包中寻找 resources/META-INF/spring.factories 文件,之后 根据文件中配置的 Jar 包去扫描项目所依赖的 Jar 包。
  2. 根据 spring.factories 配置加载 AutoConfigure 类
  3. 根据 @Conditional 注解的条件,进行自动配置并将 Bean 注入 Spring Context

总结一下,人太好就是 Spring Boot 在启动的时候,按照约定去读取 Spring Boot Starter 的配置信息,再根据配置信息对资源进行初始化,并注入到 Spring 容器中。时候 Spring Boot 启动完毕后,就之后 准备好了一切资源,使用过程中直接注入对应 Bean 资源即可。

这就是简单的三连环问答,我愿意知道有几条同学也能完整性的回答出来。

人太好 Spring Boot 含晒 好多好多 的技术点也能挖掘,今天给当让当我们分发了3个高频 Spring Boot 面试题,希望也能在后期的面试中帮助到当让当我们。

一、Spring Boot 的自动配置是何如实现的?

Spring Boot 项目的启动注解是:@SpringBootApplication,人太好它就是由下面四个多多注解组成的:

  • @Configuration
  • @ComponentScan
  • @EnableAutoConfiguration

其中 @EnableAutoConfiguration 是实现自动配置的入口,该注解又通过 @Import 注解导入了AutoConfigurationImportSelector,在该类中加载 META-INF/spring.factories 的配置信息。之后 筛选出以 EnableAutoConfiguration 为 key 的数据,加载到 IOC 容器中,实现自动配置功能!

二、那先 是嵌入式服务器?当让当我们为那先 要使用嵌入式服务器呢?

思考一下在你的虚拟机上部署应用守护进程池池也能 些那先 。

第一步:安装 Java

第二部:安装 Web 之后 是应用守护进程池池的服务器(Tomat/Wbesphere/Weblogic 等等)

第三部:部署应用守护进程池池 war 包

之后 当让当我们想复杂化那先 步骤,应该何如做呢?

让当让当我们来思考何如使服务器成为应用守护进程池池的一主次?

你只也能 四个多多安装了 Java 的虚拟机,就也能直接在中间部署应用守护进程池池了,

是完整性否是很爽?

这一 想法是嵌入式服务器的起源。

当当让当我们创建四个多多也能部署的应用守护进程池池的时候,当让当我们之后 把服务器(同类于,tomcat)嵌入到可部署的服务器中。

同类于,对于四个多多 Spring Boot 应用守护进程池池来说,愿意生成四个多多含晒 Embedded Tomcat 的应用守护进程池池 jar。你就也能像运行正常 Java 应用守护进程池池一样来运行 web 应用守护进程池池了。

嵌入式服务器就是当让当我们的可执行单元含晒 服务器的二进制文件(同类于,tomcat.jar)。

三、微服务一起调用多个接口,为社 会么会支持事务的啊?

支持分布式事务,也能使用Spring Boot集成 Aatomikos来避免,之后 我一般不建议时候使用,之后 使用分布式事务会增加请求的响应时间,影响系统的TPS。一般在实际工作中,会利用消息的补偿机制来避免分布式的事务。

四、shiro和oauth还有cas当让当我们之间的关系是那先 ?问下您公司权限是何如设计,还有就是这几条概念的区别。

cas和oauth是四个多多避免单点登录的组件,shiro主就是负责权限安全方面的工作,好多好多 功能点不一致。但往往也能 单点登陆和权限控制一起来使用,好多好多 完整性否是 cas+shiro之后 oauth+shiro时候的组合。

token一般是客户端登录后服务端生成的令牌,每次访问服务端会进行校验,一般保存到内存即可,也也能塞进这一 介质;redis也能做Session共享,之后 前端web服务器有几台负载,之后 也能 保持用户登录的状态,这场景使用比较常见。

当让当我们公司使用oauth+shiro时候的依据来做后台权限的管理,oauth负责多后台统一登录认证,shiro负责给登录用户赋予不同的访问权限。

五、各服务之间通信,对Restful和Rpc这2种依据何如做选者?

在传统的SOA治理中,使用rpc的居多;Spring Cloud默认使用restful进行服务之间的通讯。rpc通讯传输速率会比restful要高这一 ,之后 对于大多数公司来讲,这点传输速率影响甚微。我建议使用restful这一 依据,易于在不同语言实现的服务之间通讯。

六、为社 会么会设计无状态服务?

对于无状态服务,首先说一下那先 是状态:之后 四个多多数据也能 被多个服务共享,也能完成一笔交易,没有这一 数据被称为状态。进而依赖这一 “状态”数据的服务被称为有状态服务,反之称为无状态服务。

没有这一 无状态服务原则并完整性否是说在微服务架构里就不允许所处状态,表达的真实意思是要把有状态的业务服务改变为无状态的计算类服务,没有状态数据也就相应的迁移到对应的“有状态数据服务”中。

场景说明:同类于当让当我们时候在本地内存中建立的数据缓存、Session缓存,到现在的微服务架构中就应该把那先 数据迁移到分布式缓存中存储,让业务服务变成四个多多无状态的计算节点。迁移后,就也能做到按需动态伸缩,微服务应用在运行时动态增删节点,就不再也能 考虑缓存数据何如同步的问提。

七、Spring Cache 两种 常用的缓存注解和意义?

  • @Cacheable ,用来声明依据是可缓存,将结果存储到缓存中以便后续使用相同参数调用时不需执行实际的依据,直接从缓存中取值。
  • @CachePut,使用 @CachePut 标注的依据在执行前,不不去检查缓存中否是所处时候执行过的结果,就是每次否是执行该依据,并将执行结果以键值对的形式存入指定的缓存中。
  • @CacheEvict,是用来标注在也能 清除缓存元素的依据或类上的,当标记在四个多多类上时表示其中所有的依据的执行否是触发缓存的清除操作。

八、Spring Boot 何如设置支持跨域请求?

现代浏览器出于安全的考虑, HTTP 请求时也能 遵守同源策略,之后 就是跨域的 HTTP 请求,默认状态下是被禁止的,IP(域名)不同、之后 端口不同、协议不同(比如 HTTP、HTTPS)否是造成跨域问提。

一般前端的避免方案有:

  1. 使用 JSONP 来支持跨域的请求,JSONP 实现跨域请求的原理简单的说,就是动态创建<script>标签,之后 利用<script>的 SRC 不受同源策略约束来跨域获取数据。缺点是也能 后端配合输出特定的返回信息。
  2. 利用反应代理的机制来避免跨域的问提,前端请求的时候先将请求发送到同源地址的后端,通时候端请求转发来避免跨域的访问。

之后 HTML5 支持了 CORS 协议。CORS 是四个多多 W3C 标准,全称是”跨域资源共享”(Cross-origin resource sharing),允许浏览器向跨源服务器,发出 XMLHttpRequest 请求,从而克服了 AJAX 不也能同源使用的限制。它通过服务器增加四个多多特殊的 Header[Access-Control-Allow-Origin]来告诉客户端跨域的限制,之后 浏览器支持 CORS、之后 判断 Origin 通过一段话,就会允许 XMLHttpRequest 发起跨域请求。

前端使用了 CORS 协议,就也能 后端设置支持非同源的请求,Spring Boot 设置支持非同源的请求有两种 依据。

第一,配置 CorsFilter。

@Configurationpublic class GlobalCorsConfig {    @Bean    public CorsFilter corsFilter() {        CorsConfiguration config = new CorsConfiguration();          config.addAllowedOrigin("*");          config.setAllowCredentials(true);          config.addAllowedMethod("*");          config.addAllowedHeader("*");          config.addExposedHeader("*");        UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();        configSource.registerCorsConfiguration("/**", config);        return new CorsFilter(configSource);    }}

也能 配置上述的一段代码。第二种依据稍微简单这一 。

第二,在启动类上换成:

public class Application extends WebMvcConfigurerAdapter {      @Override      public void addCorsMappings(CorsRegistry registry) {          registry.addMapping("/**")                  .allowCredentials(true)                  .allowedHeaders("*")                  .allowedOrigins("*")                  .allowedMethods("*");      }  }  

九、JPA 和 Hibernate 有那先 区别?JPA 也能支持动态 SQL 吗?

JPA两种 是两种 规范,它的本质是两种 ORM规范(完整性否是ORM框架,之后 JPA并未提供ORM实现,就是制定了规范)之后 JPA是两种 规范,好多好多 ,就是提供了这一 相关的接口,之后 接口两种 能直接使用,JPA底层也能 两种 JPA实现,Hibernate 是 JPA 的四个多多实现集。

JPA 是根据实体类的注解来创建对应的表和字段,之后 也能 动态创建表之后 字段,也能 动态构建对应的实体类,再重新调用Jpa刷新整个Entity。动态SQL,mybatis支持的最好,jpa也也能支持,之后 没有Mybatis没有灵活。

十、Spring 、Spring Boot 和 Spring Cloud 的关系?

Spring 最初最核心的两大核心功能 Spring Ioc 和 Spring Aop 成就了 Spring,Spring 在这两大核心的功能上不断的发展,才有了 Spring 事务、Spring Mvc 等一系列伟大的产品,最终成就了 Spring 帝国,到了后期 Spring 几乎也能避免企业开发中的所有问提。

Spring Boot 是在强大的 Spring 帝国生态基础中间发展而来,发明 Spring Boot 完整性否是为了取代 Spring ,是为了让当让当我们更容易的使用 Spring 。

Spring Cloud 是一系列框架的有序集合。它利用 Spring Boot 的开发便利性巧妙地复杂化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都也能用 Spring Boot 的开发风格做到一键启动和部署。

Spring Cloud 是为了避免微服务架构中服务治理而提供的一系列功能的开发框架,之后 Spring Cloud 是完整性基于 Spring Boot 而开发,Spring Cloud 利用 Spring Boot 形状整合了开源行业中优秀的组件,整体对外提供了一套在微服务架构中服务治理的避免方案。

用一组不太合理的含晒 关系来表达它们之间的关系。

Spring ioc/aop > Spring > Spring Boot > Spring Cloud

参考:公号Java技术栈同名文章

本文由

纯洁的微笑

发布在

ITPUB

,转载此文请保持文章完整性性,并请附上文章来源(ITPUB)及本页链接。

原文链接:http://www.itpub.net/2019/07/22/2463/