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

  • 时间:
  • 浏览:15

前言

随着 Spring Boot 使用没有广泛,Spring Boot 原困 成为 Java 多多线程 员面试的知识点,这些 同学对 Spring Boot 理解全是没有深刻,一直就会被2个连环跑给干趴下了!

比如下面你这些 段的 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 在启动的已经 会干这几件事情:

  • ① Spring Boot 在启动可以 去依赖的 Starter 包中寻找 resources/META-INF/spring.factories 文件,这些 根据文件中配置的 Jar 包去扫描项目所依赖的 Jar 包。

  • ② 根据 spring.factories 配置加载 AutoConfigure 类

  • ③ 根据 @Conditional 注解的条件,进行自动配置并将 Bean 注入 Spring Context

总结一下,其实也不 Spring Boot 在启动的已经 ,按照约定去读取 Spring Boot Starter 的配置信息,再根据配置信息对资源进行初始化,并注入到 Spring 容器中。另一好2个 多 Spring Boot 启动完毕后,就原困 准备好了一切资源,使用过程中直接注入对应 Bean 资源即可。

这也不简单的三连环问答,我不知道有2个同学都可以完整的回答出来。

其实 Spring Boot 含晒 这些 的技术点还可以 挖掘,今天给亲戚朋友 收集了十个 高频 Spring Boot 面试题,希望还可以 在后期的面试中帮助到亲戚朋友 。

1、Spring Boot 的自动配置是怎么才能 才能 实现的?

Spring Boot 项目的启动注解是:@SpringBootApplication,其实它也不由下面一好2个 多注解组成的:

  • @Configuration

  • @ComponentScan

  • @EnableAutoConfiguration

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

2、有哪些是嵌入式服务器?亲戚朋友 为有哪些要使用嵌入式服务器呢?

思考一下在你的虚拟机上部署应用多多线程 还可以可以 些有哪些。

第一步:安装 Java

第二部:安装 Web 原困 是应用多多线程 的服务器(Tomat/Wbesphere/Weblogic 等等)

第三部:部署应用多多线程 war 包

原困 亲戚朋友 想错综复杂有有哪些步骤,应该怎么才能 才能 做呢?

让亲戚朋友 来思考怎么才能 才能 使服务器成为应用多多线程 的一帕累托图?

你只还可以可以 一好2个 多安装了 Java 的虚拟机,就还可以 直接在中间部署应用多多线程 了,

是全是很爽?

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

当亲戚朋友 创建一好2个 多还可以 部署的应用多多线程 的已经 ,亲戚朋友 原困 把服务器(累似 ,tomcat)嵌入到可部署的服务器中。

累似 ,对于一好2个 多 Spring Boot 应用多多线程 来说,我太少 生成一好2个 多含晒 Embedded Tomcat 的应用多多线程 jar。你就还可以 像运行正常 Java 应用多多线程 一样来运行 web 应用多多线程 了。

嵌入式服务器也不亲戚朋友 的可执行单元含晒 服务器的二进制文件(累似 ,tomcat.jar)。

3、微服务同時 调用多个接口,缘何支持事务的啊?

支持分布式事务,还可以 使用Spring Boot集成 Aatomikos来防止,这些 我一般不建议另一好2个 多使用,原困 使用分布式事务会增加请求的响应时间,影响系统的TPS。一般在实际工作中,会利用消息的补偿机制来防止分布式的事务。

4、shiro和oauth还有cas亲戚朋友 之间的关系是有哪些?问下您公司权限是怎么才能 才能 设计,还有也不这2个概念的区别。

cas和oauth是一好2个 多防止单点登录的组件,shiro主也不负责权限安全方面的工作,这些 功能点不一致。但往往还可以可以 单点登陆和权限控制同時 来使用,这些 全是 cas+shiro原困 oauth+shiro另一好2个 多的组合。

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

亲戚朋友 公司使用oauth+shiro另一好2个 多的法律法子来做后台权限的管理,oauth负责多后台统一登录认证,shiro负责给登录用户赋予不同的访问权限。

5、各服务之间通信,对Restful和Rpc这2种法律法子怎么才能 才能 做挑选?

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

6、缘何设计无情況服务?

对于无情況服务,首先说一下有哪些是情況:原困 一好2个 多数据还可以可以 被多个服务共享,可以完成一笔交易,没有你这些 数据被称为情況。进而依赖你这些 “情況”数据的服务被称为有情況服务,反之称为无情況服务。

没有你这些 无情況服务原则并全是说在微服务架构里就不允许占据 情況,表达的真实意思是要把有情況的业务服务改变为无情況的计算类服务,没有情況数据也就相应的迁移到对应的“有情況数据服务”中。

场景说明:累似 亲戚朋友 已经 在本地内存中建立的数据缓存、Session缓存,到现在的微服务架构中就应该把有有哪些数据迁移到分布式缓存中存储,让业务服务变成一好2个 多无情況的计算节点。迁移后,就还可以 做到按需动态伸缩,微服务应用在运行时动态增删节点,就不再还可以可以 考虑缓存数据怎么才能 才能 同步的大问题。

7、Spring Cache 并全是常用的缓存注解和意义?

@Cacheable ,用来声明法律法子是可缓存,将结果存储到缓存中以便后续使用相同参数调用时不需执行实际的法律法子,直接从缓存中取值。

@CachePut,使用 @CachePut 标注的法律法子在执行前,我太少 去检查缓存中否是是占据 已经 执行过的结果,也不每次可以 执行该法律法子,并将执行结果以键值对的形式存入指定的缓存中。

@CacheEvict,是用来标注在还可以可以 清除缓存元素的法律法子或类上的,当标记在一好2个 多类上时表示其中所有的法律法子的执行可以 触发缓存的清除操作。

8、Spring Boot 怎么才能 才能 设置支持跨域请求?

现代浏览器出于安全的考虑, HTTP 请求时还可以可以 遵守同源策略,这些 也不跨域的 HTTP 请求,默认情況下是被禁止的,IP(域名)不同、原困 端口不同、协议不同(比如 HTTP、HTTPS)可以 造成跨域大问题。

一般前端的防止方案有:

  • ① 使用 JSONP 来支持跨域的请求,JSONP 实现跨域请求的原理简单的说,也不动态创建<script>标签,这些 利用<script>的 SRC 不受同源策略约束来跨域获取数据。缺点是还可以可以 后端配合输出特定的返回信息。

  • ② 利用反应代理的机制来防止跨域的大问题,前端请求的已经 先将请求发送到同源地址的后端,通已经 端请求转发来防止跨域的访问。

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

前端使用了 CORS 协议,就还可以可以 后端设置支持非同源的请求,Spring Boot 设置支持非同源的请求有并全是法律法子。

第一,配置 CorsFilter。


@Configuration
public 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("*");  

    }  
}  

9、JPA 和 Hibernate 有有哪些区别?JPA 还可以 支持动态 SQL 吗?

JPA并全是是并全是规范,它的本质是并全是ORM规范(全是ORM框架,原困 JPA并未提供ORM实现,也不制定了规范)原困 JPA是并全是规范,这些 ,也不提供了这些 相关的接口,这些 接口并还可以 直接使用,JPA底层还可以可以 并全是JPA实现,Hibernate 是 JPA 的一好2个 多实现集。

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

10、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