首页 > 自考资讯 > 高考百科

Spring Boot(springboot自动配置原理)

小条 2024-07-05

随着Spring Boot的使用越来越广泛,Spring Boot成为Java程序员面试中的一个知识点,很多同学对Spring Boot了解不深,最终被几个连环骗子击倒的情况屡见不鲜。

例如,以下Spring Boot 问答:

问:您认为Spring Boot 最大的优势是什么?

答:Spring Boot最大的优点就是“约定优于配置”。 “约定优于配置”是一种软件设计范式,允许开发人员以传统方式进行编程。这减少了软件开发人员需要做出的决策数量,并在不牺牲灵活性的情况下提供了简单性的好处。

问:哪里可以找到Spring Boot“约定优于配置”的具体产品实现?

答:Spring Boot Starter 和Spring Boot JPa 都是“约定优于配置”的体现。所有这一切都是围绕“约定优于配置”的设计理念设计的,Spring Boot Starter 根据启动过程中约定的信息来初始化资源,避免了大量的SQL。编写无效代码。有关更多信息,请参阅为什么Spring Boot 如此受欢迎?

问:Spring Boot Starter 是如何工作的?

答:Spring Boot 在启动时会执行以下操作:

Spring Boot启动时会在依赖的Starter包中查找resource/META-INF/spring.factories文件,并根据文件中设置的Jar包扫描项目所依赖的Jar包。 根据spring.factories 的设置加载AutoConfigure 类 根据@Conditional 注解的条件进行自动配置,并将bean 注入Spring Context 综上所述,Spring Boot 启动时,实际上是加载配置。然后根据配置信息初始化资源并注入到Spring容器中。这样Spring Boot启动后,所有的资源就都准备好了,使用时就可以直接注入对应的bean资源了。

这是一个简单的三连问答,但不知道有多少同学能够完整的回答出来。

其实Spring Boot有很多技术点需要考虑。今天,我们整理了Spring Boot 面试中的10 个常见问题。我希望它对以后的面试有用。

1. Spring Boot自动配置是如何实现的?

Spring Boot项目的启动注解是@SpringBootApplication。它实际上由三个注释组成:

@Configuration@ComponentScan@EnableAutoConfiguration 其中,@EnableAutoConfiguration是实现自动配置的入口,该注解通过@Import注解导入AutoConfigurationImportSelector,读取该类的META-INF/spring.factories的配置信息。接下来,使用EnableAutoConfiguration作为key过滤数据并将其加载到IOC容器中以实现自动配置功能。

2.什么是嵌入式服务器?为什么要使用嵌入式服务器?

考虑一下将应用程序部署到虚拟机需要做什么。

第1 步:安装Java

第2部分:安装Web服务器或应用程序服务器(Tomat/Wbesphere/Weblogic等)

第3 部分:部署应用程序war 包

如果您想简化这些步骤怎么办?

让我们考虑一下如何使服务器成为应用程序的一部分。

您所需要的只是一个安装了Java 的虚拟机,您可以直接在其上部署应用程序。

是不是很棒?

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

创建可部署应用程序时,您将服务器(例如tomcat)嵌入到可部署服务器中。

例如,对于Spring Boot 应用程序,您可以生成包含嵌入式Tomcat 的应用程序jar。然后,您可以像任何常规Java 应用程序一样运行您的Web 应用程序。

嵌入式服务器是包含服务器二进制文件(例如tomcat.jar)的可执行单元。

3、微服务同时调用多个接口时如何支持事务?

为了支持分布式事务,可以使用Spring Boot集成Aatomikos来解决问题,但是使用分布式事务会增加请求响应时间,影响系统的TPS,所以通常不推荐这种使用。在实际业务中,一般会采用消息补偿机制来处理分布式事务。

4、hiro、oauth、cas之间是什么关系?请问你们公司的权限是如何设计的,以及这些概念之间的区别。

Cas和oauth是解决单点登录的组件,而Shiro主要负责权限安全,因此它们的功能不匹配。但单点登录和权限控制往往需要配合使用,所以就有了cas+hiro、oauth+hiro等组合。

令牌通常是在客户端登录后由服务器生成的。通常,每次访问服务器时都会对其进行验证。这可以存储在内存中或用于会话共享。前端Web服务器有多台服务器,需要保持服务器加载,但用户仍然需要登录。这种场景比较常见。

我们使用oauth+hiro来管理后端权限。 oauth负责多个后端的统一登录认证,hiro为登录用户授予不同的访问权限。

5. 服务间通信应该选择Restful还是Rpc?

传统的SOA治理主要使用RPC,而Spring Cloud默认使用RESTful进行服务之间的通信。 RPC比RESTful具有更高的通信效率,但是对于大多数企业来说这个效率影响不大。我们建议使用Restful,因为用不同语言实现的服务之间更容易通信。

6. 如何设计无状态服务?

说到无状态服务,我们首先解释一下什么是状态。当数据必须由多个服务共享才能完成事务时,该数据称为状态。依赖此“状态”数据的服务称为有状态服务,反之称为无状态服务。

因此,无状态服务的这一原则并不意味着微服务架构中不能存在状态。它的真正含义是将有状态的业务服务转变为无状态的计算服务,并相应地转向有状态的数据服务。 ”。

场景描述:例如,在当前的微服务架构中,之前建立在本地内存中的数据和会话缓存必须迁移到分布式缓存中进行存储,使业务服务成为无状态计算节点。迁移后,您的微服务应用程序可以在运行时动态添加和删除节点,而无需担心如何同步缓存数据。

7、Spring Cache中常用的三个缓存注解是什么,分别代表什么意思?

@Cacheable 用于声明一个方法可缓存,并将结果存储在缓存中。这样就不需要使用相同的参数进行后续调用来执行实际方法并直接从缓存中检索值。

@CachePut在执行带有@CachePut注解的方法之前不会检查缓存中是否有之前执行的结果,而是每次执行该方法并将执行结果以键值对的格式保存。在指定的缓存中。

@CacheEvict 用于标记应该清除其缓存元素的方法或类。标记一个类会在执行该类中的所有方法时触发缓存清除操作。

8、如何配置Spring Boot支持跨域请求?

出于安全原因,现代浏览器在发出HTTP 请求时必须遵守同源策略。如果不这样做,将导致跨域HTTP 请求,默认情况下是禁止的。要么IP(域名)不同,要么端口不同。或者如果协议不同(HTTP、HTTPS 等),您将遇到跨域问题。

常见的前端解决方案包括:

使用JSONP支持跨域请求JSONP实现跨域请求的原理是动态创建脚本标签,利用脚本的SRC来支持跨域请求,而不依赖于同源获取数据。政策。缺点是后端需要协同工作才能输出具体的返回信息。 使用反应式代理机制解决跨域问题。前端发出请求时,首先将请求发送到同源地址的后端,并转发后端请求,避免跨域。使用权。后来HTML5支持了CORS协议。 CORS 是一个W3C 标准,其正式名称是“跨源资源共享”。这允许浏览器向跨源服务器发出XMLHttpRequest请求,克服了AJAX只能从同源使用的限制。在服务器上添加一个特殊的头【Access-Control-Allow-Origin】,如果浏览器支持CORS并确定Origin通过,则XMLHttpRequest可以发起跨域请求。

如果您的前端使用CORS 协议,您必须配置后端以支持非原始请求。有两种方法可以配置Spring Boot 支持非原始请求。

首先,设置CorsFilter。

@作品

公共类GlobalCorsConfig {

@Beanpublic CorsFilter corsFilter() {

CorsConfiguration config=new CorsConfiguration();

config.addAllowedOrigin('*');

config.setAllowCredentials(true);

config.addAllowedMethod('*');

config.addAllowedHeader('*');

config.addExusedHeader('*');

UrlBasedCorsConfigurationSource configSource=new UrlBasedCorsConfigurationSource();

configSource.registerCorsConfiguration('/**', config);

返回一个新的CorsFilter(configSource)。

}

}

上面的代码部分需要进行配置。第二种方法稍微容易一些。

接下来,添加启动类。

公共类应用程序扩展WebMvcConfigurerAdapter {

@覆盖

公共无效addCorsMappings(CorsRegistry注册表){

注册表.addMapping('/**')

.allowCredentials(true)

.allowedHeaders('*')

.allowedOrigins('*')

.allowedMethods('*');

}

}

9. JPA和Hibernate有什么区别?JPA可以支持动态SQL吗?

JPA本身是一个规范,其核心是一个ORM规范(JPA不是一个ORM框架,因为它不提供ORM实现,只是开发了一个规范)。然而,由于JPA是一个规范,它只提供了一些相关的接口。在JPA的底层,我们需要某种JPA实现,它是一组JPA实现。

JPA根据实体类中的注解创建相应的表和字段。如果需要动态创建表或字段,则需要动态构造相应的实体类,然后再次调用JPA来更新整个实体。动态SQL最好是mybatis支持的,jpa也可以支持,但是没有Mybatis灵活。

10.Spring、Spring Boot、Spring Cloud 之间是什么关系?

Spring 的前两个核心特性使Spring 成为可能:Spring Iocs 和Spring Aops。 Spring 继续在这两个核心特性的基础上进行构建,最终创建了Spring Transactions 和Spring Mvc 等一系列伟大的产品,从而使Spring 帝国成为可能。到了晚年,Spring几乎能够解决企业开发中的所有问题。

Spring Boot 建立在强大的Spring Empire 生态系统之上。 Spring Boot 的发明是为了让Spring 更容易使用,而不是为了取代它。

Spring Cloud 是一个有序的框架集合。利用Spring Boot的开发便利性,熟练地简化分布式系统基础设施的开发,例如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等。这一切都是使用Spring Boot开发风格完成的,一键启动和部署。

Spring Cloud 是一个开发框架,提供了一组用于解决微服务架构中的服务治理的功能,完全在Spring Boot 之上开发,并集成了开源行业提供的最佳组件。一组微服务架构中服务治理的解决方案。

我们使用一组非理性包含关系来表达它们之间的关系。

Spring ioc/aop Spring Spring Boot Spring Cloud

版权声明:本文转载于网络,版权归作者所有。如有侵权,请联系本站编辑删除。

猜你喜欢