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

  • 时间:
  • 浏览:0
  • 来源:大发pk10_pk10走势图_大发pk10走势图

前言

随着 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 在启动的但是会干这几件事情:

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

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

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

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

这只是简单的三连环问答,问你有十几个 同学不能完正的回答出来。

确实 Spring Boot 所含否则 否则 的技术点都不能挖掘,今天给否则 人 儿派发了二个高频 Spring Boot 面试题,希望都不能在后期的面试中帮助到否则 人 儿。

1、Spring Boot 的自动配置是如保实现的?

Spring Boot 项目的启动注解是:@SpringBootApplication,确实它只是由下面有另一个注解组成的:

  • @Configuration

  • @ComponentScan

  • @EnableAutoConfiguration

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

2、哪些是嵌入式服务器?否则 人 儿为哪些要使用嵌入式服务器呢?

思考一下在你的虚拟机上部署应用多多线程 前要些哪些。

第一步:安装 Java

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

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

可能性否则 人 儿想复杂性哪些步骤,应该如保做呢?

让否则 人 儿来思考如保使服务器成为应用多多线程 的一部分?

你只前要有另一个安装了 Java 的虚拟机,就都不能直接在上端部署应用多多线程 了,

是也有很爽?

并否有想法是嵌入式服务器的起源。

当否则 人 儿创建有另一个都不能部署的应用多多线程 的但是,否则 人 儿可能性把服务器(例如于,tomcat)嵌入到可部署的服务器中。

例如于,对于有另一个 Spring Boot 应用多多线程 来说,否则你生成有另一个所含 Embedded Tomcat 的应用多多线程 jar。你就都不能像运行正常 Java 应用多多线程 一样来运行 web 应用多多线程 了。

嵌入式服务器只否有则 人 儿的可执行单元所含服务器的二进制文件(例如于,tomcat.jar)。

3、微服务一同调用多个接口,为什么我么我支持事务的啊?

支持分布式事务,都不能使用Spring Boot集成 Aatomikos来出理 ,否则我一般不建议但是 使用,可能性使用分布式事务会增加请求的响应时间,影响系统的TPS。一般在实际工作中,会利用消息的补偿机制来出理 分布式的事务。

4、shiro和oauth还有cas否则 人 之间的关系是哪些?问下您公司权限是如保设计,还有只是这十几个 概念的区别。

cas和oauth是有另一个出理 单点登录的组件,shiro主只是负责权限安全方面的工作,否则 否则 功能点不一致。但往往前要单点登陆和权限控制一同来使用,否则 否则 也有 cas+shiro可能性oauth+shiro但是 的组合。

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

否则 人 儿公司使用oauth+shiro但是 的法子来做后台权限的管理,oauth负责多后台统一登录认证,shiro负责给登录用户赋予不同的访问权限。

5、各服务之间通信,对Restful和Rpc这2种法子如保做选用?

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

6、为什么我么我设计无情况服务?

对于无情况服务,首先说一下哪些是情况:可能性有另一个数据前要被多个服务共享,不能完成一笔交易,没人 并否有数据被称为情况。进而依赖并否有“情况”数据的服务被称为有情况服务,反之称为无情况服务。

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

场景说明:例如于否则 人 儿但是在本地内存中建立的数据缓存、Session缓存,到现在的微服务架构中就应该把哪些数据迁移到分布式缓存中存储,让业务服务变成有另一个无情况的计算节点。迁移后,就都不能做到按需动态伸缩,微服务应用在运行时动态增删节点,就不再前要考虑缓存数据如保同步的疑问。

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

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

@CachePut,使用 @CachePut 标注的法子在执行前,不需要去检查缓存中否有指在但是执行过的结果,只是每次也有执行该法子,并将执行结果以键值对的形式存入指定的缓存中。

@CacheEvict,是用来标注在前要清除缓存元素的法子或类上的,当标记在有另一个类上时表示其中所有的法子的执行也有触发缓存的清除操作。

8、Spring Boot 如保设置支持跨域请求?

现代浏览器出于安全的考虑, HTTP 请求时前要遵守同源策略,否则只是跨域的 HTTP 请求,默认情况下是被禁止的,IP(域名)不同、可能性端口不同、协议不同(比如 HTTP、HTTPS)也有造成跨域疑问。

一般前端的出理 方案有:

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

  • ② 利用反应代理的机制来出理 跨域的疑问,前端请求的但是先将请求发送到同源地址的后端,通但是端请求转发来出理 跨域的访问。

但是 HTML5 支持了 CORS 协议。CORS 是有另一个 W3C 标准,全称是”跨域资源共享”(Cross-origin resource sharing),允许浏览器向跨源服务器,发出 XMLHttpRequest 请求,从而克服了 AJAX 必须同源使用的限制。它通过服务器增加有另一个特殊的 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 的有另一个实现集。

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