Spring Boot 经典面试题(二)

news/2024/4/30 7:44:49/文章来源:https://blog.csdn.net/Nekosann/article/details/137587903

1.Spring Boot如何加载外部配置文件?

Spring Boot 设计了一种非常灵活的方式来加载外部配置文件,允许你轻松地管理和调整应用程序的配置而无需改动代码。这些配置文件可以是 properties 文件、YAML 文件、环境变量或命令行参数。Spring Boot 在启动时会按照特定的顺序来加载这些配置,这个顺序确保了特定配置的优先级,使得某些配置可以覆盖其他配置。

配置文件的加载顺序

以下是 Spring Boot 加载外部配置文件的一般顺序,较高的配置覆盖较低的配置:

  1. 命令行参数
  2. 来自 SPRING_APPLICATION_JSON 的属性(环境变量或系统属性中的内联 JSON)
  3. ServletConfig 初始化参数
  4. ServletContext 初始化参数
  5. JNDI 属性
  6. Java 系统属性(System.getProperties()
  7. 操作系统环境变量
  8. 随机生成的配置属性(用于注入随机值如端口号等)
  9. 应用程序在打包时打包到应用内部的配置文件(application.properties 或 application.yml,包括通过 profile 定义的变种)
  10. 在应用程序外部的配置文件(运行时指定的位置,例如通过 --spring.config.location 指定的文件或路径)
  11. 通过配置服务加载的配置属性(例如 Spring Cloud Config)
  12. @Configuration 类上的 @PropertySource 注解
  13. 默认属性(通过 SpringApplication.setDefaultProperties 指定)

如何指定外部配置文件

  • 命令行参数:可以在启动应用时通过命令行参数指定配置属性,如 java -jar app.jar --server.port=8081
  • 应用属性文件:默认情况下,Spring Boot 从应用的 classpath 下的 application.propertiesapplication.yml 文件加载配置。
  • 环境变量:可以设置环境变量来覆盖配置,特别是在云环境或容器环境中非常有用。
  • 外部配置文件位置:使用 --spring.config.location 命令行参数指定外部配置文件的位置,可以是文件路径或目录路径。

使用 Profile

Spring Boot 允许你为不同的环境定义不同的配置文件,称为“profiles”。这些文件命名为 application-{profile}.propertiesapplication-{profile}.yml。你可以通过设置 spring.profiles.active 环境变量来激活特定的配置文件。

通过这些机制,Spring Boot 提供了一种强大而灵活的方式来管理应用配置,使得应用能够适应不同的环境和需求,而无需改动代码。

2. Spring Boot如何实现跨域请求?

在Spring Boot中实现跨域请求(CORS,Cross-Origin Resource Sharing),有几种常用的方法:

1. @CrossOrigin 注解

最简单的方式是在控制器(Controller)或者具体的方法上使用@CrossOrigin注解。这个注解允许你细致地控制哪些请求来源、HTTP方法等被允许访问。

示例:

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@CrossOrigin(origins = "http://example.com") // 允许来自http://example.com的跨域请求
public class MyController {@GetMapping("/greeting")public String greeting() {return "Hello, World";}
}

2. 全局配置

如果你想为所有的控制器配置CORS策略,可以使用WebMvcConfigurer接口。

示例:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class MyConfiguration {@Beanpublic WebMvcConfigurer corsConfigurer() {return new WebMvcConfigurer() {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**") // 对所有路径应用规则.allowedOrigins("http://example.com") // 允许来自http://example.com的请求.allowedMethods("GET", "POST", "PUT", "DELETE"); // 允许指定的请求方法}};}
}

3. Spring Security 配置

如果你的项目中集成了Spring Security,你需要在Spring Security的配置中添加CORS配置,因为Spring Security的安全控制会优先于CORS配置生效。

示例:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http// 其他配置....cors().and() // 启用CORS配置// 其他配置...}@Beanpublic CorsFilter corsFilter() {UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();CorsConfiguration config = new CorsConfiguration();config.setAllowCredentials(true); // 允许cookies跨域config.addAllowedOrigin("http://example.com");config.addAllowedHeader("*");config.addAllowedMethod("*");source.registerCorsConfiguration("/**", config);return new CorsFilter(source);}
}

选择适合你需求的方法来实现跨域请求的支持。通常,对于小规模或特定的需求,使用@CrossOrigin注解是最简单直接的方式。而对于需要全局配置跨域策略的情况,通过全局配置或者Spring Security配置会更加合适。

3. Spring Boot的热部署是如何实现的?

Spring Boot 的热部署(也称为热重载)允许开发者在应用运行时更新部分资源(如代码、配置和静态资源),而无需重新启动整个应用。这大大加快了开发过程,因为你可以立即看到更改的效果。Spring Boot 可以通过使用 Spring Loaded 或 Spring Boot DevTools 来实现热部署。

使用 Spring Boot DevTools 实现热部署

Spring Boot DevTools 是 Spring Boot 官方提供的一个模块,旨在提高开发效率。它提供了一系列开发时的便利功能,包括自动重启、模板引擎的缓存禁用等。自动重启是实现热部署的关键特性。

如何配置:
  1. 添加 DevTools 依赖:首先,你需要在你的项目中加入 Spring Boot DevTools 的依赖。如果你使用 Maven,可以在 pom.xml 中添加如下依赖:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency>
</dependencies>

如果你使用 Gradle,则添加如下依赖:

dependencies {developmentOnly("org.springframework.boot:spring-boot-devtools")
}
  1. 启用自动重启:仅通过添加 DevTools 依赖,大部分情况下自动重启功能就已经启用。Spring Boot DevTools 默认会监控项目路径下的文件变动,并在检测到更改时重新启动应用。

  2. 配置 IDEA 或其他 IDE:在某些 IDE 中,比如 IntelliJ IDEA,你需要确保「Build Project Automatically」设置被启用(可以在 Preferences -> Compiler 中找到)。对于 Eclipse,你可能需要安装额外的插件来支持自动编译。

工作原理:
  • 当你保存对项目中的文件的更改时,IDE 会自动编译更改过的文件。
  • Spring Boot DevTools 检测到类路径上的更改后,会触发应用的重启。
  • 为了缩短重启时间,DevTools 使用两个类加载器:一个用于第三方库(不变的部分),另一个用于项目的类(会变动的部分)。只有会变动的部分在重启时被重新加载,从而加快了重启速度。

注意事项

虽然热部署提高了开发效率,但它也有一些限制。例如,更改不能改变已有的 bean 定义或是添加新的 bean。对于这种类型的更改,仍然需要重新启动应用。此外,使用 DevTools 时,由于它的工作原理,可能会与某些库产生兼容性问题。因此,虽然它非常适合开发环境,但不建议在生产环境中使用 DevTools。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1046054.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跨域问题一文解决

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;Vue ⛺️稳中求进&#xff0c;晒太阳 一、为什么会出现跨域的问题&#xff1f; 是浏览器的同源策略&#xff0c;跨域也是因为浏览器这个机制引起的&#xff0c;这个机制的存在还是在于安全…

Netty 入门应用之Http服务WebSocket

Netty实现Http服务 主要的变化是在初始化器中引入了新的编解码器 一些创建的类作用和Netty HelloWorld的小demo一样我这里就不再次重复了 1、Http服务端代码 public class HttpServer {public static void main(String[] args) {// 创建Reactor// 用来管理channel 监听事件 …

力扣HOT100 - 238. 除自身以外数组的乘积

解题思路&#xff1a; 当前位置的结果就是它左部分的乘积再乘以它右部分的乘积。因此需要进行两次遍历&#xff0c;第一次遍历用于求左部分的乘积&#xff0c;第二次遍历在求右部分的乘积的同时&#xff0c;再将最后的计算结果一起求出来。 class Solution {public int[] prod…

Vue3学习01 Vue3核心语法

Vue3学习 1. Vue3新的特性 2. 创建Vue3工程2.1 基于 vue-cli 创建项目文件说明 2.2 基于 vite 创建具体操作项目文件说明 2.3 简单案例(vite) 3. Vue3核心语法3.1 OptionsAPI 与 CompositionAPIOptions API 弊端Composition API 优势 ⭐3.2 setup小案例setup返回值setup 与 Opt…

【vue/uniapp】使用 smooth-signature 实现 h5 的横屏电子签名

通过github链接进行下载&#xff0c;然后代码参考如下&#xff0c;功能包含了清空、判断签名内容是否为空、生成png/jpg图片等。 签名效果&#xff1a; 预览效果&#xff1a; 下载 smooth-signature 链接&#xff1a;https://github.com/linjc/smooth-signature 代码参考&a…

nexus搭建maven与docker镜像的私有仓库

引言 通过nexus搭建maven与docker镜像的私有仓库,实现jar包与镜像动态更新、共享、存储。 一、nexus部署 通过docker-compose部署nexus name: java services:#############################环境#############################env-nexus:restart: always## 3.58.1image: so…

ANSYS 2024 R1 HFSS部分更新介绍(附下载)

1. 优化Layout component工作流 • 支持多区域 - 支持参数化弯曲定义的刚柔结合的PCB • Phi 网格可用 • 支持Mesh Fusion •简化创建复杂装配体的过程 2. 提升求解器速度 • 分布式矩阵汇编的内存使用率改进 ‐减少分布式矩阵求解器的RAM消耗 • 分布式稀疏直接求解器&am…

物联网实战--驱动篇之(六)4G通讯(Air780E)

目录 一、4G模块简介 二、AIR780E驱动程序 三、AIR780使用注意事项 四、结合MQTT传输测试 一、4G模块简介 4G应该是我们日常生活最常见的一种互联网通讯方式了&#xff0c;每个智能手机都配置了&#xff0c;不过手机的4G跟我们物联网领域要用的4G有点区别。首先是物联网采用…

芯来科技、IAR和MachineWare携手加速符合ASIL标准RISC-V汽车芯片创新

支持软件开发团队在虚拟硬件平台上进行固件和MCAL开发 芯来科技&#xff08;Nuclei&#xff09;、IAR和MachineWare紧密合作&#xff0c;加速RISC-V ASIL合规汽车解决方案的创新。此次合作简化了汽车电子的固件和MCAL开发&#xff0c;提供了虚拟和物理硬件平台之间的无缝集成。…

Harmony鸿蒙南向驱动开发-SDIO

SDIO&#xff08;Secure Digital Input and Output&#xff09;由SD卡发展而来&#xff0c;与SD卡统称为MMC&#xff08;MultiMediaCard&#xff09;&#xff0c;二者使用相同的通信协议。SDIO接口兼容以前的SD卡&#xff0c;并且可以连接支持SDIO接口的其他设备。 运作机制 …

SpringBoot --pagehelper分页

目录 1.建立数据库 2.页面显示 3.基本逻辑 4.配置依赖 5.使用pagehelper 6.页面列表 页面 效果 1.建立数据库 create database if not exists my_book; use my_book; create table if not exists myBook (id int primary key auto_increment,name varchar(50) not …

Node.js常用快捷键

1.常用的终端命令&#xff1a; &#xff08;1&#xff09;del 文件名&#xff1a; 删除文件 &#xff08;2&#xff09;ipconfig: 查看IP命令 &#xff08;3&#xff09;mkdir 目录名 &#xff1a;在当前目录新建指定目录 &#xff08;4&#xff09;rd 目录名&#xff1a;在当前…

【opencv】示例-ela.cpp JPEG图像的错误等级分析(ELA) 通过分析图像压缩后的差异来检测图像是否被篡改过...

ela_modified.jpg 原始ela_modified压缩后再解压得到compressed_img 差异图像Ela 这段代码的功能是实现JPEG图像的错误等级分析&#xff08;ELA&#xff09;&#xff0c;通过分析图像压缩后的差异来检测图像是否被篡改过。程序会首先读取一张图片&#xff0c;然后对其应用质量…

PHP自助建站系统,小白也能自己搭建网站

无需懂代码&#xff0c;用 自助建站 做企业官网就像做PPT一样简单&#xff0c;您可以亲自操刀做想要的效果&#xff01; 自助建站是一款简单、快捷、高效的工具&#xff0c;可以帮助您制作响应式网站。我们的自助建站系统&#xff0c;将传统的编码工作转化为直观的拖拽操作和文…

Qt | 元对象系统

一、QByteArray 类简介 1、QByteArray 类简介  该类是一个用于处理字符串的类似于 C++的 string 类型的类,在 Qt 中,对字符串的处理,经常使用的是 QString 类,该类保证字符串以\0结尾,并使用隐式共享(copy-on-write)来减少内存用量和不必要的数据复制。  QByteArra…

Web3 的社会影响:数字社会的新时代

随着科技的不断进步和创新&#xff0c;人类社会正逐步进入数字化时代的新阶段。Web3 技术作为数字社会的重要组成部分&#xff0c;正在以前所未有的方式重塑着我们的社会生活和交往方式。本文将探讨 Web3 技术对社会的影响&#xff0c;以及它所带来的数字社会的新时代。 1. Web…

Gitlab全量迁移

Gitlab全量迁移 一、背景1.前提条件 一、背景 公司研发使用的Gitlab由于服务器下架需要迁移到新的Gitlab服务器上。Gitlab官方推荐了先备份然后再恢复的方法。个人采用官方的另外一种方法&#xff0c;就写这篇文章给需要的小伙伴参考。 源Gitlab: http://old.mygitlab.com #地…

数据应用OneID:ID-Mapping Spark GraphX实现

前言 说明 以用户实体为例&#xff0c;ID 类型包含 user_id 和 device_id。当然还有其他类型id。不同id可以获取到的阶段、生命周期均不相同。 device_id 生命周期通常指的是一个设备从首次被识别到不再活跃的整个时间段。 user_id是用户登录之后系统分配的唯一标识&#xff…

3D数据发布工具HOOPS Publish如何将3D模型转换成PDF格式?

在现代科技发展的推动下&#xff0c;3D技术在各个行业中扮演着越来越重要的角色。从工程设计到医疗保健&#xff0c;从建筑规划到教育培训&#xff0c;3D模型都成为了理解、沟通和展示复杂数据的主要工具。而将这些3D模型转换成PDF格式&#xff0c;能够使其更易于共享、存档和展…

配置交换机端口安全

1、实验目的 通过本实验可以掌握&#xff1a; 交换机管理地址配置及接口配置。查看交换机的MAC地址表。配置静态端口安全、动态端口安全和粘滞端口安全的方法。 2、实验拓扑 配置交换机端口安全的实验拓扑如图所示。 配置交换机端口安全的实验拓扑 3、实验步骤 &#xff…