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

  • 时间:
  • 浏览:1
  • 来源:幸运快3_快3破解器app_幸运快3破解器app

前言

随着 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 所含某些的技术点促使挖掘,今天给亲戚亲戚亲戚朋友整理了1个高频 Spring Boot 面试题,希望促使在后期的面试中帮助到亲戚亲戚亲戚朋友。

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

Spring Boot 项目的启动注解是:@SpringBootApplication,我觉得它但是由下面一有有有1个注解组成的:

  • @Configuration

  • @ComponentScan

  • @EnableAutoConfiguration

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

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

思考一下在你的虚拟机上部署应用系统系统进程都要些哪几种。

第一步:安装 Java

第二部:安装 Web 肯能是应用系统系统进程的服务器(Tomat/Wbesphere/Weblogic 等等)

第三部:部署应用系统系统进程 war 包

肯能亲戚亲戚亲戚朋友想比较复杂哪几种步骤,应该怎样才能做呢?

让亲戚亲戚亲戚朋友来思考怎样才能使服务器成为应用系统系统进程的一主次?

你只都要一一有有有1个安装了 Java 的虚拟机,就促使直接在里面部署应用系统系统进程了,

是删改不会很爽?

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

当亲戚亲戚亲戚朋友创建一一有有有1个促使部署的应用系统系统进程的但是,亲戚亲戚亲戚朋友肯能把服务器(这类,tomcat)嵌入到可部署的服务器中。

这类,对于一一有有有1个 Spring Boot 应用系统系统进程来说,让他生成一一有有有1个所含 Embedded Tomcat 的应用系统系统进程 jar。你就促使像运行正常 Java 应用系统系统进程一样来运行 web 应用系统系统进程了。

嵌入式服务器但是亲戚亲戚亲戚朋友的可执行单元所含服务器的二进制文件(这类,tomcat.jar)。

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

支持分布式事务,促使使用Spring Boot集成 Aatomikos来防止,但是一般不建议曾经使用,肯能使用分布式事务会增加请求的响应时间,影响系统的TPS。一般在实际工作中,会利用消息的补偿机制来防止分布式的事务。

4、shiro和oauth还有cas亲戚亲戚亲戚朋友之间的关系是哪几种?问下您公司权限是怎样才能设计,还有但是这几次概念的区别。

cas和oauth是一一有有有1个防止单点登录的组件,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、为什么在么在设计无请况服务?

对于无请况服务,首先说一下哪几种是请况:肯能一一有有有1个数据都要被多个服务共享,促使完成一笔交易,如此这俩 数据被称为请况。进而依赖这俩 “请况”数据的服务被称为有请况服务,反之称为无请况服务。

如此这俩 无请况服务原则并删改不会说在微服务架构里就不允许位于请况,表达的真实意思是要把有请况的业务服务改变为无请况的计算类服务,如此请况数据也就相应的迁移到对应的“有请况数据服务”中。

场景说明:这类亲戚亲戚亲戚朋友但是在本地内存中建立的数据缓存、Session缓存,到现在的微服务架构中就应该把哪几种数据迁移到分布式缓存中存储,让业务服务变成一一有有有1个无请况的计算节点。迁移后,就促使做到按需动态伸缩,微服务应用在运行时动态增删节点,就不再都要考虑缓存数据怎样才能同步的难题。

7、Spring Cache 这俩 常用的缓存注解和意义?

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

@CachePut,使用 @CachePut 标注的方式在执行前,不必去检查缓存中是与否位于但是执行过的结果,但是每次不会执行该方式,并将执行结果以键值对的形式存入指定的缓存中。

@CacheEvict,是用来标注在都要清除缓存元素的方式或类上的,当标记在一一有有有1个类上时表示其中所有的方式的执行不会触发缓存的清除操作。

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

现代浏览器出于安全的考虑, HTTP 请求时都要遵守同源策略,但是但是跨域的 HTTP 请求,默认请况下是被禁止的,IP(域名)不同、肯能端口不同、协议不同(比如 HTTP、HTTPS)不会造成跨域难题。

一般前端的防止方案有:

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

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

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

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