在Java开发领域,Spring Boot无疑是近年来最热门的技术之一。它以其简洁、高效的特点,赢得了众多开发者的青睐。无论是初创公司还是大型企业,Spring Boot都成为了他们构建应用程序的首选框架。今天,我们就来聊聊Spring Boot面试中那些常见的问题,帮助你在面试中脱颖而出。
1. 什么是 Spring Boot?
Spring Boot是Spring框架的子项目,旨在简化Spring应用程序的创建和配置过程。它提供了大量的starter依赖,使得开发者无需手动配置各种复杂的XML或Java配置文件,从而加快了开发速度。
2. 为什么要用 Spring Boot?
Spring Boot的主要优势在于快速开发、配置简化、内嵌服务器容器(如Tomcat)、独立运行以及生产级监控等。这些特点使得开发者能够更专注于业务逻辑的实现,而无需过多关注基础设施的配置。
3. Spring Boot 与 Spring Cloud 区别?
Spring Boot是一个快速开发的Spring框架,专注于简化单个应用的开发和部署。而Spring Cloud是一个基于Spring Boot的微服务框架,提供了服务发现、配置管理、熔断器等功能,用于构建分布式系统。Spring Cloud依赖于Spring Boot。
4. Spring Boot 如何加载外部配置文件?
Spring Boot会自动加载application.properties或application.yml作为默认配置文件。如果需要加载其他配置文件,可以通过@PropertySource注解来实现。
5. Spring Boot 如何实现跨域请求?
可以通过在@SpringBootApplication注解的类上使用@CrossOrigin注解,或者在Controller的方法上使用@CrossOrigin注解来实现跨域请求。
6. Spring Boot 的热部署是如何实现的?
可以使用Spring Boot DevTools实现热部署,它支持类文件和资源文件的热部署。只需在pom.xml中添加spring-boot-devtools依赖即可。
7. Spring Boot 如何配置多数据源?
可以通过@Primary注解设置主数据源,使用@Qualifier注解指定具体的数据源。每个数据源都需要配置一个@Bean,并使用@ConfigurationProperties注解来绑定配置属性。
8. Spring Boot 中如何实现 AOP?
可以通过@Aspect注解定义切面,通过@Before、@After等注解定义通知。切面类需要使用@Component注解进行注册。
9. Spring Boot 中如何实现异步方法调用?
可以使用@Async注解标注方法,使其成为异步方法。调用异步方法时,会返回一个CompletableFuture对象。
10. Spring Boot 如何处理异常?
可以使用@ControllerAdvice注解定义全局异常处理类,使用@ExceptionHandler注解处理特定异常。这样可以集中处理所有Controller中的异常。
11. Spring Boot 的自动装配是什么?
自动装配是Spring Boot的一项特性,通过@EnableAutoConfiguration和@ComponentScan自动加载符合条件的Bean。@SpringBootApplication注解就是@EnableAutoConfiguration和@ComponentScan的组合。
12. Spring Boot 如何实现消息队列?
可以使用Spring Boot集成的消息队列中间件,如ActiveMQ、RabbitMQ,通过@EnableJms或@EnableRabbit注解开启相应功能。
13. Spring Boot 中如何使用定时任务?
可以使用@Scheduled注解标注方法,定时执行任务。例如,@Scheduled(fixedRate = 10000)表示每10秒执行一次任务。
14. Spring Boot 的数据校验如何实现?
可以使用@Valid和@Validated注解进行数据校验,结合BindingResult获取校验结果。如果校验失败,可以在Controller中捕获BindingResult对象,获取具体的校验错误信息。
15.@ComponentScan注解是干什么的?
被@ComponentScan修饰的java类,如果没有指定具体的扫描路径。实际上他默认的扫描路径是当前JAVA类所在的路径及其子路径,都是被扫描的范围。
16.bootstrap.yml的作用?
bootstrap.yml在SpringBoot中默认是不支持的,需要在SpringCloud环境下才支持,作用是在SpringBoot项目启动之前启动的一个父容器,该父容器可以在SpringBoot容器启动之前完成一些加载初始化的操作。比如加载配置中心中的信息。
17.SpringBoot如何解决跨域问题?
在Spring Boot中,解决跨域问题主要有以下几种方式:
1. 使用@CrossOrigin注解
可以在特定的控制器类或方法上添加@CrossOrigin注解,允许跨域访问。
2. 全局配置CORS
通过实现WebMvcConfigurer接口,重写addCorsMappings方法,可以全局配置跨域访问规则:这种方式适用于需要全局统一配置跨域访问规则的场景。
3. 使用CorsFilter
可以通过配置CorsFilter来实现跨域支持:这种方式同样适用于全局配置跨域访问。
4. 自定义Filter
如果需要更灵活的跨域配置,可以自定义Filter:后在Spring Boot中注册该Filter。
注意事项
- 允许凭据时的限制:如果allowCredentials设置为true,则allowedOrigins不能使用*,必须指定具体的域名。
- 重启服务:配置完成后,需要重启Spring Boot服务以使配置生效。
18.SpringBoot的优点?
- 1.简化开发与配置:秉持“约定大于配置”理念,大幅削减 XML 和 Java 配置代码,仅需 @SpringBootApplication 注解即可启动完整应用,省去手动配置 Spring 容器的繁琐步骤。
- 2.提升开发效率:集成众多常用依赖与功能,覆盖数据库、安全、监控等常见需求,开发者无需从零搭建环境,可直接聚焦于业务逻辑开发,显著加快应用系统开发进度。
- 3.独立运行:可将应用程序打包为独立的 JAR 或 WAR 文件,内含所有依赖与配置,简化了不同环境下的部署流程,应用可直接通过 java -jar 命令快速启动。
- 4.集成丰富生产级功能:内置性能监控、健康检查、分布式追踪等功能,为生产环境中的应用管理和运维提供有力支持,如通过 /actuator/health 端点轻松查看应用健康状态。
- 5.拥有强大生态系统:与 Spring Data、Spring Security、Spring Cloud 等众多流行框架和工具无缝集成,助力开发者轻松构建复杂且功能强大的应用系统。
- 6.天然契合微服务架构:为应对微服务架构下服务间灵活协作需求,提供与服务注册发现工具(如 Eureka)、分布式追踪(如 Sleuth 和 Zipkin)、断路器(如 Hystrix)等的集成支持。
- 7.内置嵌入式服务器:支持 Tomcat、Jetty、Undertow 等嵌入式服务器,无需单独安装与配置外部服务器,简化开发、测试流程,保证环境一致性。
- 8.提供内置监控与管理:借助 Actuator 模块,方便开发者获取应用健康状况、性能指标、线程池使用情况、缓存状态等信息,且可通过 HTTP 端点或 JMX 灵活访问。
- 9.兼容多语言及部署方式:除支持 Java 外,还兼容 Kotlin、Groovy 等语言,部署方式上支持传统 WAR 包、内嵌服务器以及与云服务、容器化技术(如 Docker)的集成。
- 10.开发工具助力高效开发:Spring Boot DevTools 提供热部署、应用自动重启、增强 IDE 集成等功能,显著提升开发效率,使开发者能够更快速地编写和调试代码。
19.Spring Boot、 Spring MVC 和 Spring 有什么区别?
1、Spring
Spring最重要的特征是依赖注入。所有 SpringModules 不是依赖注入就是 IOC 控制反转。当我们恰当的使用 DI 或者是 IOC 的时候,我们可以开发松耦合应用。松耦合应用的单元测试可以很容易的进行。
2、Spring MVC
Spring MVC 提供了一种分离式的方法来开发 Web 应用。通过运用像 DispatcherServelet,MoudlAndView 和 ViewResolver 等一些简单的概念,开发 Web 应用将会变的非常简单。
3、SpringBoot
Spring Boot 通过一个自动配置和启动的项来目解决需要大量配置文件问题。快捷构建产品就绪应用程序,Spring Boot 提供了一些非功能性特征。
20.RequestMapping 和 GetMapping 的不同之处?
RequestMapping 具有类属性的,可进行 GET,POST,PUT 或者其它请求方法。
GetMapping 是 GET 请求方法中的一个特例。
21.Spring Boot 需要独立的容器运行吗?
可以不需要,内置了 Tomcat/ Jetty 等容器
22.解 Spring Boot 中的 Starters如何理解?
它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成 Spring及其他技术,而不需要到处找示例代码和依赖包;并且带有默认配置,提高了开发效率;
23.Spring Boot 支持哪些日志框架?
支持 Java Util Logging, Log4j2, Lockback 作为日志框架,默认Lockback
24.SpringBoot 实现热部署方式?
1、Spring Loaded 2、Spring-boot-devtools
25.Spring Boot 的核心注解是哪个?
● @SpringBootConfiguration:
组合了 @Configuration 注解,实现配置文件的功能。
● @EnableAutoConfiguration:
打开自动配置的功能,也可以关闭某个自动配置的选项,
● @ComponentScan:Spring组件扫描
26.Spring Boot 兼容老 Spring 项目吗,如何做兼容?
可以兼容,使用 @ImportResource 注解导入老 Spring 项目配置文件。
27.如何在SpringBoot中实现定时任务?
1.一个就是使用 Spring 中的 @Scheduled 注解,
2.另一个则是使用第三方框架 Quartz。
28.Springboot中各个模块之间的功能?
Controller 模块:
处理 URL 请求和响应,将用户请求转发到相应服务
Service 模块:
包含业务逻辑代码,实现核心业务功能。
Repository 模块:
数据访问层,处理与数据库的交互。
Configuration 模块:
Spring 配置及 Bean 定义,管理应用的各个组件。
29.springboot常用的依赖包?
spring-boot-starter-web:提供构建 Web 应用所需的依赖。
spring-boot-starter-data-jpa:提供 JPA 数据访问支持,便于操作数据库。
spring-boot-starter-security:加入安全保护的依赖,提升应用安全性。
spring-boot-starter-test:测试环境所需的依赖,确保应用的稳定性。
30.Springboot中为什么不推荐使用@Autowired?
Spring 官方推荐使用构造器注入,而不是字段注入。使用 @Autowired 会导致业务代码与 Spring 框架强绑定,如果换用其他 IOC 框架,代码可能不兼容。而 @Resource 是 Java 标准的一部分,如果必须使用字段注入,建议使用 @Resource。
31.springboot的启动流程
1. 启动 `main()` 方法
入口函数调用 `SpringApplication.run(主类.class, args)`,启动Spring Boot应用。
2. 创建 `SpringApplication` 对象
推断应用类型(如Servlet、Reactive或普通应用)。通过SPI机制加载 SpringFactoriesLoader 中的初始化器(ApplicationContextInitializer)和监听器(ApplicationListener)。 确定主配置类(通过堆栈分析)。
3. 准备环境(ConfigurableEnvironment`)
加载配置文件(`application.properties`/`application.yml`)。
合并系统环境变量和命令行参数(优先级:命令行 > 系统变量 > 配置文件)。
4. 创建并刷新 ApplicationContext
据应用类型创建对应的上下文(如 AnnotationConfigServletWebServerApplicationContext)。
核心步骤:执行 AbstractApplicationContext.refresh(),完成以下操作:
加载 @Configuration 类、@ComponentScan 的Bean、自动配置类(@EnableAutoConfiguration)。
触发 BeanFactoryPostProcessor(如解析 @PropertySource)。
注册并实例化单例Bean,完成依赖注入(@Autowired)。
5. 启动嵌入式Web服务器
在上下文刷新过程中,通过 `ServletWebServerFactory` 创建嵌入式容器(如Tomcat)。
- 注册 DispatcherServlet 和过滤器(Filter),完成Servlet容器的初始化。
6. 发布 ApplicationStartedEvent事件
通知监听器应用已启动(但此时部分Runner可能未执行)。
7. 执行 CommandLineRunner 和 ApplicationRunne
这两个接口的 `run()` 方法会在应用完全就绪前执行,常用于初始化任务
8. 发布 ApplicationReadyEvent` 事件
应用完全就绪,可接收外部请求或执行定时任务。
32.springboot配置文件加载的优先级?
1.命令行参数
2.JAR包外的 application-{profile}.properties
3.JAR包内的 application-{profile}.properties
4.JAR包外的 application.properties
5.JAR包内的 application.properties。
如果 application.properties 和 application.yml 同时存在,同样的参数,最终生效的是 application.properties 中的配置。
33.SpringBoot打成的jar和普通jar有什么区别?
Spring Boot 项目最终打包成的 jar:
1.可以直接执行,通过 java -jar xxx.jar 命令来运行
2.不可作为普通jar给别的项目引用即使依赖了也无法使用其中的类。