Spring Boot-面试题(52)
摘要:
1、通俗易懂,适合小白
2、仅做面试复习用,部分来源网络,博文免费,知识无价,侵权请联系!
1. 什么是 Spring Boot 框架?
Spring Boot 是基于 Spring 框架的快速开发框架,它简化了 Spring 应用的初始搭建和开发过程。它通过自动配置和起步依赖减少了大量的配置工作。
2. Spring Boot 框架的有什么优缺点?
优点:
- 快速构建独立 Spring 应用
- 内嵌服务器,无需部署 WAR 文件
- 提供自动配置的 starter 项目依赖
- 提供生产就绪功能如指标、健康检查等
- 无需 XML 配置
缺点:
- 学习曲线较陡峭
- 对于非常简单的应用可能过于复杂
- 自动配置有时难以理解和定制
3. Spring Boot 核心注解都有哪些?
@SpringBootApplication
:组合注解,包含@Configuration
、@EnableAutoConfiguration
和@ComponentScan
@RestController
:组合@Controller
和@ResponseBody
@RequestMapping
:映射 web 请求@Autowired
:自动装配依赖@Configuration
:标记类为配置类@ComponentScan
:组件扫描
4. Spring Boot 的目录结构是怎样的?
典型结构:
src/main/java/com.example.demo/DemoApplication.java # 主启动类resources/static/ # 静态资源templates/ # 模板文件application.properties # 配置文件test/java/com.example.demo/DemoApplicationTests.java # 测试类
5. Spring Boot 需要独立的容器运行吗?
不需要。Spring Boot 内置了 Tomcat、Jetty 或 Undertow 等服务器容器,可以直接运行。
6. Spring Boot 运行方式有哪几种?
- 通过 IDE 直接运行主类
- 使用 Maven:
mvn spring-boot:run
- 打包成可执行 JAR:
java -jar app.jar
- 打包成 WAR 部署到外部容器
7. Spring Boot 自动配置原理是什么?
通过@EnableAutoConfiguration
注解触发,Spring Boot 会检查 classpath 中的 jar 包,根据META-INF/spring.factories
文件中定义的自动配置类进行条件化配置。
8. Spring Boot 热部署有几种方式?
- 使用 Spring Boot DevTools
- 使用 JRebel 插件
- 配置 IDE 自动编译
9. Spring Boot 支持哪几种内嵌容器?
- Tomcat (默认)
- Jetty
- Undertow
10. 什么是 Spring Boot Starter?
Starter 是一组方便的依赖描述符,可以一站式获取所需的所有相关技术依赖。例如spring-boot-starter-web
包含了开发 web 应用所需的依赖。
11. Spring Boot Starter 有什么命名规范?
官方 starter 命名格式:spring-boot-starter-*
第三方 starter 命名格式:*-spring-boot-starter
12. Spring Boot 启动器都有哪些?
常见的有:
spring-boot-starter-web
:Web 应用spring-boot-starter-data-jpa
:JPA 支持spring-boot-starter-test
:测试支持spring-boot-starter-security
:安全支持spring-boot-starter-thymeleaf
:Thymeleaf 模板
13. 什么是 JavaConfig?
JavaConfig 是 Spring 提供的基于 Java 的配置方式,替代传统的 XML 配置。使用@Configuration
注解标记配置类。
14. 什么是 YAML?
YAML 是一种人类友好的数据序列化标准,常用于 Spring Boot 的配置文件。比 properties 文件更结构化。
15. YAML 配置和 properties 配置有什么区别?
- YAML 支持层次结构,properties 是扁平结构
- YAML 更易读,适合复杂配置
- properties 文件更简单,适合简单配置
16. Spring Boot 是否可以使用 XML 配置?
可以,但不推荐。Spring Boot 推荐使用 JavaConfig 或注解配置,但可以通过@ImportResource
导入 XML 配置。
17. Spring Boot 中核心配置文件是什么?
application.properties
或application.yml
,默认放在resources
目录下。
18. bootstrap.properties 和 application.properties 有何区别?
bootstrap.properties
:由父 ApplicationContext 加载,优先级更高,常用于配置中心application.properties
:由子 ApplicationContext 加载
19. 什么是 Spring Profiles?
Profile 是 Spring 提供的环境隔离机制,可以通过@Profile
注解或配置文件指定不同环境的配置。
20. Spring Security 和 Shiro 对比有什么优缺点?
Spring Security:
- 优点:深度集成 Spring 生态,功能全面
- 缺点:配置复杂,学习曲线陡峭
Shiro:
- 优点:简单易用,轻量级
- 缺点:功能相对较少,与 Spring 集成需要额外配置
21. 什么是 Spring Batch?
Spring Batch 是 Spring 提供的轻量级批处理框架,用于处理大量数据的批处理作业。
22. 什么是 CSRF 攻击?
跨站请求伪造(CSRF)是一种攻击方式,攻击者诱使用户在已认证的网站上执行非预期的操作。Spring Security 提供了 CSRF 防护。
23. Spring Boot 中监视器是什么?
Spring Boot Actuator 提供的监控端点,可以监控应用运行状态,如/health
、/metrics
等。
24. Spring Boot 中如何禁用 Actuator 端点安全性?
在application.properties
中添加:
management.security.enabled=false
25. 如何监视所有 Spring Boot 微服务?
可以使用 Spring Boot Admin,它集成了 Actuator 端点,提供统一的监控界面。
26. spring-boot-starter-parent 有什么用?
作为父 POM,提供依赖管理、默认配置和插件配置,简化 Maven 配置。
27. Spring Boot jar 和普通 jar 有什么区别?
Spring Boot jar 是可执行 jar,包含内嵌容器和所有依赖,可以直接运行。普通 jar 需要部署到容器中运行。
28. Spring Boot 中如何实现全局异常处理?
使用@ControllerAdvice
和@ExceptionHandler
注解:
@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public ResponseEntity<String> handleException(Exception e) {return ResponseEntity.status(500).body(e.getMessage());}
}
29. Spring Boot 中如何实现定时任务?
使用@Scheduled
注解:
@Component
public class ScheduledTasks {@Scheduled(fixedRate = 5000)public void reportCurrentTime() {System.out.println("Current time: " + new Date());}
}
30. Spring Boot 中如何兼容旧 Spring 项目?
- 逐步迁移配置到 JavaConfig
- 使用
@ImportResource
导入旧 XML 配置 - 保持兼容的依赖版本
31. Spring Boot 中如何解决跨域问题?
@Configuration
public class CorsConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("*").allowedMethods("GET", "POST", "PUT", "DELETE");}
}
32. Spring Boot 内嵌容器默认是什么?
默认是 Tomcat。
33. Spring Boot 2.X 有什么新特性?与 1.X 有什么区别?
- 基于 Spring Framework 5
- 响应式编程支持
- 性能改进
- Actuator 改进
- 配置属性绑定改进
34. Spring、Spring MVC 和 Spring Boot 有什么区别?
- Spring:核心框架,提供IoC和AOP
- Spring MVC:基于 Spring 的 Web MVC 框架
- Spring Boot:基于 Spring 的快速开发框架,简化配置
35. 如何实现 Spring Boot 应用程序的安全性?
使用 Spring Security:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/public/**").permitAll().anyRequest().authenticated().and().formLogin();}
}
36. 如何重新加载 Spring Boot 上的更改内容,而无需重启服务?
使用 Spring Boot DevTools 或 JRebel 插件。
37. 如何自定义端口运行 Spring Boot 应用程序?
在application.properties
中:
server.port=8081
38. Spring Boot 如何禁用某些自动配置特性?
使用@EnableAutoConfiguration
的exclude属性:
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
39. Spring boot 中当 bean 存在时如何重启执行自动配置?
使用@ConditionalOnMissingBean
注解的自动配置类会在没有相应 bean 时生效。
40. Spring Boot 如何编写一个集成测试?
@SpringBootTest
@AutoConfigureMockMvc
class DemoApplicationTests {@Autowiredprivate MockMvc mockMvc;@Testvoid contextLoads() throws Exception {mockMvc.perform(get("/")).andExpect(status().isOk());}
}
41. Spring Boot 中 Actuator 有什么作用?
提供生产就绪功能,如健康检查、指标收集、环境信息等监控端点。
42. Spring Boot 有什么外部配置的可能来源?
- 命令行参数
- Java 系统属性
- 操作系统环境变量
- 配置文件(properties/yml)
- @Configuration类
43. Spring Boot 支持松绑定表示什么含义?
属性名可以灵活匹配,如my.property-name
、my.propertyName
和MY_PROPERTYNAME
都会绑定到同一个属性。
44. Spring Boot 如何注册一个定制的自动化配置?
- 创建
META-INF/spring.factories
文件 - 添加
org.springframework.boot.autoconfigure.EnableAutoConfiguration
键 - 列出全限定名的自动配置类
45. 什么是 Swagger? Spring Boot 如何实现 Swagger?
Swagger 是 API 文档工具。Spring Boot 集成:
<dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version>
</dependency>
@Configuration
@EnableSwagger2
public class SwaggerConfig {@Beanpublic Docket api() {return new Docket(DocumentationType.SWAGGER_2).select().apis(RequestHandlerSelectors.any()).paths(PathSelectors.any()).build();}
}
46. 如何使用 Spring Boot 实现分页和排序?
使用 Spring Data JPA:
public interface UserRepository extends JpaRepository<User, Long> {Page<User> findAll(Pageable pageable);
}@GetMapping("/users")
public Page<User> getUsers(Pageable pageable) {return userRepository.findAll(pageable);
}
请求示例:/users?page=0&size=10&sort=name,asc
47. 如何使用 Maven 来构建一个 Spring Boot 程序?
- 使用
spring-boot-starter-parent
作为父POM - 添加所需starter依赖
- 使用
spring-boot-maven-plugin
打包
48. Spring Boot web 应用程序如何部署为 JAR 或 WAR 文件?
JAR:默认方式,使用spring-boot-maven-plugin
WAR:
- 修改打包方式为war
- 继承
SpringBootServletInitializer
- 配置
spring-boot-maven-plugin
49. 什么是 WebSocket?
WebSocket 是一种全双工通信协议,允许服务端主动向客户端推送数据。
50. Spring Boot 和 Spring 有什么区别?
Spring Boot 是基于 Spring 的快速开发框架,简化了配置和部署,提供了自动配置、起步依赖和内嵌服务器等特性。
51. 常见的系统架构风格有哪些?各有什么优缺点?
- 单体架构:简单但难以扩展
- 分层架构:逻辑清晰但性能有损耗
- 微服务架构:灵活可扩展但复杂度高
- 事件驱动架构:松耦合但难以调试
- 服务导向架构(SOA):重用性好但ESB可能成为瓶颈
52. 什么是 AKF 拆分原则?
AKF扩展立方体理论,三个维度扩展:
- X轴:水平复制(克隆)
- Y轴:功能拆分(微服务)
- Z轴:数据分区(分片)