Spring Boot常见面试题汇总(含代码)
一、核心概念
1. Spring Boot 优点
快速创建独立、生产级的Spring应用
内嵌服务器(Tomcat/Jetty/Undertow),无需WAR部署
自动配置,简化配置
提供生产就绪特性(健康检查、指标、外部配置)
无代码生成,无需XML配置
2. 核心注解
@SpringBootApplication // 等价于: @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan
3. 自动配置原理
// 1. spring.factories 中定义自动配置类 // 2. @Conditional 条件注解控制加载 // 3. 通过 spring-boot-autoconfigure 实现
二、自动配置
1. 条件注解
@ConditionalOnClass // 类路径存在指定类 @ConditionalOnMissingClass @ConditionalOnBean // 容器中存在指定Bean @ConditionalOnMissingBean @ConditionalOnProperty // 配置属性存在 @ConditionalOnResource // 资源存在 @ConditionalOnWebApplication @ConditionalOnNotWebApplication @ConditionalOnExpression // SpEL表达式
2. 禁用自动配置
// 方式1:注解
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
// 方式2:配置
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration3. 自定义 Starter
# 1. 创建 spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.MyAutoConfiguration
# 2. 创建配置类
@Configuration
@ConditionalOnClass(MyService.class)
@EnableConfigurationProperties(MyProperties.class)
public class MyAutoConfiguration {
// 自动配置逻辑
}三、配置管理
1. 配置文件优先级
# 1. 命令行参数
# 2. 系统环境变量
# 3. 外部配置文件(application-{profile}.yml)
# 4. 内部配置文件(application-{profile}.yml)
# 5. @ConfigurationProperties
# 6. 默认值2. 多环境配置
# application.yml
spring:
profiles:
active: @activatedProperties@ # Maven属性
# application-dev.yml
# application-prod.yml
# application-test.yml3. 配置绑定
// 方式1:@ConfigurationProperties
@Component
@ConfigurationProperties(prefix = "myapp")
@Data
public class MyConfig {
private String name;
private int port;
private List<String> hosts;
}
// application.yml
myapp:
name: demo
port: 8080
hosts:
- host1
- host2四、Web开发
1. RESTful API
@RestController
@RequestMapping("/api/users")
public class UserController {
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
@PostMapping
public User createUser(@Valid @RequestBody User user) {
return userService.save(user);
}
@PutMapping("/{id}")
public User updateUser(@PathVariable Long id,
@RequestBody User user) {
return userService.update(id, user);
}
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable Long id) {
userService.delete(id);
}
}2. 全局异常处理
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public Result handleException(Exception e) {
return Result.error(e.getMessage());
}
@ExceptionHandler(MethodArgumentNotValidException.class)
public Result handleValidation(MethodArgumentNotValidException e) {
String message = e.getBindingResult()
.getFieldErrors()
.stream()
.map(FieldError::getDefaultMessage)
.collect(Collectors.joining(","));
return Result.error(message);
}
}3. 拦截器与过滤器
// 拦截器
@Component
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) {
// 鉴权逻辑
return true;
}
}
// 注册拦截器
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private AuthInterceptor authInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/login");
}
}五、数据访问
1. 整合 MyBatis
# application.yml
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.example.entity
configuration:
map-underscore-to-camel-case: true2. 多数据源配置
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties("spring.datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties("spring.datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public SqlSessionFactory primarySqlSessionFactory(
@Qualifier("primaryDataSource") DataSource dataSource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
}
}3. 事务管理
@Service
public class UserService {
@Transactional(rollbackFor = Exception.class)
public void createUser(User user) {
// 业务逻辑
userRepository.save(user);
// 异常时回滚
}
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
// 事务传播
}
}六、缓存
1. 整合 Redis
spring:
redis:
host: localhost
port: 6379
password:
database: 0
lettuce:
pool:
max-active: 8
max-wait: -1ms
max-idle: 8
min-idle: 02. 缓存注解
@Service
@CacheConfig(cacheNames = "users")
public class UserService {
@Cacheable(key = "#id")
public User getUser(Long id) {
return userRepository.findById(id);
}
@CachePut(key = "#user.id")
public User updateUser(User user) {
return userRepository.save(user);
}
@CacheEvict(key = "#id")
public void deleteUser(Long id) {
userRepository.deleteById(id);
}
@Caching(evict = {
@CacheEvict(key = "#user.id"),
@CacheEvict(key = "'list'")
})
public void update(User user) {
// 更新操作
}
}七、安全
1. Spring Security 配置
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}2. JWT 集成
@Component
public class JwtTokenUtil {
public String generateToken(UserDetails userDetails) {
Map<String, Object> claims = new HashMap<>();
return Jwts.builder()
.setClaims(claims)
.setSubject(userDetails.getUsername())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + expiration))
.signWith(SignatureAlgorithm.HS512, secret)
.compact();
}
}八、消息队列
1. 整合 RabbitMQ
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest2. 生产者
@Component
public class RabbitProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendMessage(String exchange, String routingKey, Object message) {
rabbitTemplate.convertAndSend(exchange, routingKey, message);
}
}3. 消费者
@Component
@RabbitListener(queues = "queueName")
public class RabbitConsumer {
@RabbitHandler
public void process(String message) {
// 处理消息
}
}九、监控与管理
1. Actuator 端点
management:
endpoints:
web:
exposure:
include: "*" # 暴露所有端点
endpoint:
health:
show-details: always常用端点:
/actuator/health- 健康检查/actuator/info- 应用信息/actuator/metrics- 指标/actuator/loggers- 日志级别/actuator/beans- Bean信息/actuator/mappings- 请求映射
2. 自定义健康检查
@Component
public class CustomHealthIndicator implements HealthIndicator {
@Override
public Health health() {
// 检查逻辑
boolean isHealthy = checkService();
if (isHealthy) {
return Health.up()
.withDetail("service", "available")
.build();
} else {
return Health.down()
.withDetail("service", "unavailable")
.build();
}
}
}十、测试
1. 单元测试
@SpringBootTest
@RunWith(SpringRunner.class)
public class UserServiceTest {
@MockBean
private UserRepository userRepository;
@Autowired
private UserService userService;
@Test
public void testGetUser() {
User mockUser = new User();
mockUser.setId(1L);
mockUser.setName("test");
when(userRepository.findById(1L))
.thenReturn(Optional.of(mockUser));
User result = userService.getUser(1L);
assertEquals("test", result.getName());
}
}2. 集成测试
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private UserService userService;
@Test
public void testGetUser() throws Exception {
when(userService.getUser(1L))
.thenReturn(new User(1L, "test"));
mockMvc.perform(get("/api/users/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name").value("test"));
}
}十一、部署与优化
1. 打包部署
# 打包 mvn clean package # 运行 java -jar target/myapp.jar # 指定配置 java -jar myapp.jar --spring.profiles.active=prod
2. Docker 部署
# Dockerfile
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]3. 性能优化
# 应用优化
server:
tomcat:
max-threads: 200
min-spare-threads: 10
# JVM参数
java -Xms512m -Xmx1024m -XX:+UseG1GC -jar app.jar十二、常见问题
1. 循环依赖
// 场景:A依赖B,B依赖A
// 解决方案:
// 1. 使用@Lazy延迟加载
@Component
public class A {
@Autowired
@Lazy
private B b;
}
// 2. 使用Setter/构造器注入
// 3. 使用@PostConstruct2. Bean 作用域
@Scope("singleton") // 单例(默认)
@Scope("prototype") // 原型
@Scope("request") // 请求
@Scope("session") // 会话
@Scope("application") // 应用3. 启动流程
1. 加载 SpringApplication 2. 运行 run() 方法 3. 准备环境 Environment 4. 创建 ApplicationContext 5. 执行 ApplicationContextInitializer 6. 加载 BeanDefinitions 7. refresh() 刷新上下文 8. 执行 Runner 9. 启动完成
十三、新版本特性(2.x/3.x)
1. Spring Boot 2.x
响应式编程(WebFlux)
Actuator 重构
Micrometer 集成
支持 Java 11
自动配置改进
2. Spring Boot 3.x
基于 Spring Framework 6
支持 Java 17+
迁移到 Jakarta EE 9+
原生镜像支持(GraalVM)
改进的 AOT 处理
面试准备建议:
深入理解自动配置原理
掌握常用注解和配置
熟悉各模块整合(MyBatis、Redis、MQ等)
了解性能优化和监控
准备实际项目经验
关注版本更新和新特性
掌握问题排查和调试技巧
高频问题:
Spring Boot启动流程
自动配置实现原理
如何自定义Starter
多环境配置
事务管理
缓存使用
异常处理
性能监控
部署方案
到此这篇关于Spring Boot常见面试题汇总的文章就介绍到这了,更多相关SpringBoot常见面试题内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
将SpringBoot属性配置类@ConfigurationProperties注册为Bean的操作方法
在现代 Spring Boot 应用开发中,外部化配置(Externalized Configuration)是实现应用灵活性和可维护性的核心机制之一,然而,许多开发者在使用的时候经常会遇到如何确保该配置类被正确注册为 Spring 容器中的 Bean,下面小编为大家详细说说2025-12-12
springcloud项目里application.yml不加载的坑及解决
这篇文章主要介绍了springcloud项目里application.yml不加载的坑及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-07-07
JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法
本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如indexOf()方法,并通过一个算法题目来应用这些知识,感兴趣的朋友一起看看吧2025-01-01


最新评论