Spring Framework 进阶面试题
1. Spring循环依赖问题
什么是循环依赖?
当A依赖B,B依赖A时产生循环依赖:
@Service
public class A {
@Autowired
private B b;
}
@Service
public class B {
@Autowired
private A a;
}
Spring如何解决循环依赖?
Spring通过三级缓存解决循环依赖:
- singletonObjects: 一级缓存,存储完全初始化的bean
- earlySingletonObjects: 二级缓存,存储早期的bean引用
- singletonFactories: 三级缓存,存储bean的工厂对象
解决步骤:
- 创建A对象,填充属性时发现依赖B
- 将A放入三级缓存
- 创建B对象,填充属性时发现依赖A
- 从缓存中获取A的早期引用
- 完成
2. Spring事务传播机制
七种事务传播行为:
@Transactional(propagation = Propagation.REQUIRED) // 默认
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Transactional(propagation = Propagation.SUPPORTS)
@Transactional(propagation = Propagation.NOT_SUPPORTED)
@Transactional(propagation = Propagation.MANDATORY)
@Transactional(propagation = Propagation.NEVER)
@Transactional(propagation = Propagation.NESTED)
详细说明:
- REQUIRED(requires): 当前有事务就用当前的,没有就创建新的
- REQUIRES_NEW(requires_new): 总是创建新事务
- SUPPORTS(supports): 当前有事务就用当前的,没有就不用事务
- NOT_SUPPORTED(not_supported): 不支持事务,如果有事务就挂起
- MANDATORY(mandatory): 必须在事务中运行,没有事务抛异常
- NEVER(never): 不能在事务中运行,有事务抛异常
- NESTED(nested): 如果当前存在事务,则在嵌套事务内执行
3. Spring事务失效场景
常见的事务失效场景:
方法不是public
@Transactional private void transfer() { } // 事务失效
类内部调用
public class UserService { public void a() { b(); // 事务失效 } @Transactional public void b() { } }
异常被捕获
@Transactional public void transfer() { try { // 业务逻辑 } catch (Exception e) { // 异常被吃掉,事务失效 } }
异常类型不匹配
@Transactional(rollbackFor = SQLException.class) public void transfer() throws Exception { throw new RuntimeException(); // 不会回滚 }
4. Spring Boot自动配置原理
核心注解:
@SpringBootApplication
= @EnableAutoConfiguration
+ @ComponentScan
+ @Configuration
自动配置流程:
- @EnableAutoConfiguration启动自动配置
- AutoConfigurationImportSelector加载配置类
- 从META-INF/spring.factories加载自动配置类
- 根据@Conditional条件判断是否需要配置
5. Spring Boot启动流程
主要步骤:
- 准备环境
- 加载配置文件
- 准备环境变量
- 创建应用上下文
- 实例化ApplicationContext
- 刷新上下文
- 注册BeanDefinition
- 实例化单例Bean
- 执行runners
- 执行ApplicationRunner
- 执行CommandLineRunner
6. Spring中的设计模式详解
1. 工厂模式
public interface BeanFactory {
Object getBean(String name);
}
2. 单例模式
@Bean
@Scope("singleton")
public UserService userService() {
return new UserService();
}
3. 代理模式
@Aspect
@Component
public class LoggingAspect {
@Around("execution(* com.example.service.*.*(..))")
public Object logAround(ProceedingJoinPoint point) throws Throwable {
// 代理逻辑
}
}
7. Spring Security认证流程
核心组件:
- SecurityContextHolder: 存储认证信息
- Authentication: 认证信息接口
- AuthenticationManager: 认证管理器
- UserDetailsService: 用户信息服务
认证流程:
- 用户提交认证请求
- AuthenticationFilter拦截请求
- AuthenticationManager进行认证
- UserDetailsService加载用户信息
- 认证成功后存储Authentication
8. Spring Cache使用和原理
缓存注解:
@Cacheable(value = "users", key = "#id")
public User getUser(Long id) {
return userRepository.findById(id);
}
@CachePut(value = "users", key = "#user.id")
public User updateUser(User user) {
return userRepository.save(user);
}
@CacheEvict(value = "users", key = "#id")
public void deleteUser(Long id) {
userRepository.deleteById(id);
}
支持的缓存管理器:
- SimpleCacheManager
- EhCacheCacheManager
- RedisCacheManager
- CaffeineCacheManager
9. Spring Boot监控与运维
Actuator端点:
# application.properties
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
常用端点:
- /actuator/health: 应用健康状况
- /actuator/metrics: 应用指标
- /actuator/env: 环境变量
- /actuator/mappings: 路径映射
- /actuator/beans: Bean信息
10. Spring Cloud核心组件
主要组件:
- Eureka: 服务注册与发现
- Ribbon: 客户端负载均衡
- Feign: 声明式服务调用
- Hystrix: 服务熔断降级
- Gateway: 服务网关
- Config: 配置中心
- Bus: 消息总线
面试答题要点
理论结合实践
不仅要知道是什么,还要知道为什么
结合实际项目经验举例说明
掌握核心原理
理解底层实现机制
能够分析常见问题原因
了解最佳实践
掌握设计模式的应用场景
了解性能优化方案
关注新特性
了解Spring最新版本特性
掌握Spring生态系统发展趋势