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

  • 时间:
  • 浏览:1
  • 来源:极速快3_快3计划三期必中_极速快3计划三期必中

前言

随着 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