学静思语
Published on 2025-03-15 / 19 Visits
0
0

Spring Framework 进阶面试题

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的工厂对象

解决步骤:

  1. 创建A对象,填充属性时发现依赖B
  2. 将A放入三级缓存
  3. 创建B对象,填充属性时发现依赖A
  4. 从缓存中获取A的早期引用
  5. 完成

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事务失效场景

常见的事务失效场景:

  1. 方法不是public

    @Transactional
    private void transfer() { } // 事务失效
    
  2. 类内部调用

    public class UserService {
    public void a() {
        b(); // 事务失效
    }
    
    @Transactional
    public void b() { }
    }
    
  3. 异常被捕获

    @Transactional
    public void transfer() {
    try {
        // 业务逻辑
    } catch (Exception e) {
        // 异常被吃掉,事务失效
    }
    }
    
  4. 异常类型不匹配

    @Transactional(rollbackFor = SQLException.class)
    public void transfer() throws Exception {
    throw new RuntimeException(); // 不会回滚
    }
    

4. Spring Boot自动配置原理

核心注解:

@SpringBootApplication
    = @EnableAutoConfiguration
    + @ComponentScan
    + @Configuration

自动配置流程:

  1. @EnableAutoConfiguration启动自动配置
  2. AutoConfigurationImportSelector加载配置类
  3. META-INF/spring.factories加载自动配置类
  4. 根据@Conditional条件判断是否需要配置

5. Spring Boot启动流程

主要步骤:

  1. 准备环境
  2. 加载配置文件
  3. 准备环境变量
  4. 创建应用上下文
  5. 实例化ApplicationContext
  6. 刷新上下文
  7. 注册BeanDefinition
  8. 实例化单例Bean
  9. 执行runners
  10. 执行ApplicationRunner
  11. 执行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: 用户信息服务

认证流程:

  1. 用户提交认证请求
  2. AuthenticationFilter拦截请求
  3. AuthenticationManager进行认证
  4. UserDetailsService加载用户信息
  5. 认证成功后存储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核心组件

主要组件:

  1. Eureka: 服务注册与发现
  2. Ribbon: 客户端负载均衡
  3. Feign: 声明式服务调用
  4. Hystrix: 服务熔断降级
  5. Gateway: 服务网关
  6. Config: 配置中心
  7. Bus: 消息总线

面试答题要点

  1. 理论结合实践

  2. 不仅要知道是什么,还要知道为什么

  3. 结合实际项目经验举例说明

  4. 掌握核心原理

  5. 理解底层实现机制

  6. 能够分析常见问题原因

  7. 了解最佳实践

  8. 掌握设计模式的应用场景

  9. 了解性能优化方案

  10. 关注新特性

  11. 了解Spring最新版本特性

  12. 掌握Spring生态系统发展趋势


Comment