logo

Spring面试18问:核心知识体系与实战要点全解析

作者:JC2025.09.26 20:48浏览量:1

简介:本文梳理Spring面试高频问题,涵盖IoC/AOP原理、Bean生命周期、事务管理、性能优化等核心模块,结合代码示例与最佳实践,助力开发者系统掌握Spring技术栈。

一、基础概念与核心原理

1. Spring IoC与DI的实现机制是什么?
IoC(控制反转)通过依赖注入(DI)实现对象间解耦。Spring容器管理Bean的生命周期,开发者通过配置(XML/注解)声明依赖关系。例如:

  1. @Configuration
  2. public class AppConfig {
  3. @Bean
  4. public UserService userService(UserRepository repo) { // 构造器注入
  5. return new UserServiceImpl(repo);
  6. }
  7. }

关键点:

  • 容器通过反射创建Bean实例。
  • 支持构造器注入、Setter注入、字段注入(不推荐)。
  • 循环依赖通过三级缓存(SingletonObjects、EarlySingletonObjects、SingletonFactories)解决。

2. AOP的实现原理及应用场景
AOP通过动态代理(JDK动态代理/CGLIB)实现横切关注点分离。典型场景包括日志、事务、安全等。示例:

  1. @Aspect
  2. @Component
  3. public class LoggingAspect {
  4. @Before("execution(* com.example.service.*.*(..))")
  5. public void logMethodCall(JoinPoint joinPoint) {
  6. System.out.println("Method called: " + joinPoint.getSignature());
  7. }
  8. }

原理:

  • JDK动态代理要求目标类实现接口,CGLIB通过继承目标类生成代理。
  • 切点表达式(Pointcut)定义拦截规则,通知(Advice)定义执行时机。

二、Bean管理与生命周期

3. Bean的作用域及使用场景

  • Singleton:默认作用域,单例模式(如Service层组件)。
  • Prototype:每次请求创建新实例(如DTO对象)。
  • Request/Session:Web环境专用,分别对应HTTP请求和会话周期。

配置示例:

  1. @Bean
  2. @Scope("prototype")
  3. public OrderProcessor orderProcessor() {
  4. return new OrderProcessor();
  5. }

4. Bean的生命周期回调方法
通过接口或注解定义回调:

  • InitializingBean接口的afterPropertiesSet()方法。
  • @PostConstruct注解。
  • DisposableBean接口的destroy()方法。
  • @PreDestroy注解。

执行顺序:构造器 → @PostConstructafterPropertiesSet() → 自定义init方法 → 销毁时反向执行。

5. 循环依赖的解决方案
Spring通过三级缓存解决:

  1. SingletonFactories存储Bean工厂对象(ObjectFactory)。
  2. EarlySingletonObjects:存储提前曝光的半成品Bean。
  3. SingletonObjects:存储完全初始化的Bean。

当A依赖B且B依赖A时,容器会先实例化A,暴露半成品到二级缓存,再初始化B时从二级缓存获取A的引用。

三、事务与数据访问

6. @Transactional的传播行为与隔离级别
传播行为(Propagation):

  • REQUIRED:默认,加入当前事务。
  • REQUIRES_NEW:新建事务,挂起当前事务。
  • NESTED:嵌套事务,内部回滚不影响外部。

隔离级别(Isolation):

  • READ_UNCOMMITTED:可能读到未提交数据。
  • READ_COMMITTED:避免脏读(Oracle默认)。
  • REPEATABLE_READ:避免不可重复读(MySQL默认)。
  • SERIALIZABLE:完全串行化。

配置示例:

  1. @Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_COMMITTED)
  2. public void updateOrder(Order order) { ... }

7. JdbcTemplate与JPA/Hibernate的对比

  • JdbcTemplate:底层JDBC封装,需手动编写SQL,适合简单查询。
  • JPA/Hibernate:ORM框架,支持面向对象查询(JPQL/HQL),适合复杂业务。

性能优化:

  • JdbcTemplate启用批处理:jdbcTemplate.batchUpdate(sql, batchArgs)
  • JPA启用二级缓存:@Cacheable注解 + EHCache配置。

四、Web与MVC

8. Spring MVC的执行流程

  1. DispatcherServlet接收请求。
  2. HandlerMapping定位控制器方法。
  3. HandlerAdapter调用方法并处理参数绑定。
  4. ViewResolver解析视图(如Thymeleaf/JSP)。
  5. 返回响应。

关键注解:

9. 拦截器(Interceptor)与过滤器(Filter)的区别
| 特性 | 拦截器 | 过滤器 |
|——————————|——————————————|——————————————|
| 依赖框架 | Spring MVC | Servlet规范 |
| 执行顺序 | 控制器方法前后 | 请求进入Servlet容器前后 |
| 访问范围 | 可获取HandlerMethod信息 | 仅能访问HttpServletRequest |

配置示例:

  1. public class AuthInterceptor implements HandlerInterceptor {
  2. @Override
  3. public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) {
  4. return req.getSession().getAttribute("user") != null;
  5. }
  6. }

五、高级特性与优化

10. Spring Boot自动配置原理
通过@EnableAutoConfiguration注解触发,依赖spring-boot-autoconfigure模块中的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,按条件(@Conditional)加载配置类。例如:

  1. @Configuration
  2. @ConditionalOnClass(DataSource.class)
  3. public class DataSourceAutoConfiguration { ... }

11. 响应式编程(WebFlux)适用场景

  • 高并发、低延迟需求(如实时聊天)。
  • 非阻塞I/O模型,基于Reactor库。

示例:

  1. @GetMapping("/stream")
  2. public Flux<String> streamEvents() {
  3. return Flux.interval(Duration.ofSeconds(1)).map(i -> "Event-" + i);
  4. }

12. 性能优化建议

  • Bean懒加载@Lazy注解减少启动时间。
  • 缓存配置@Cacheable + Redis缓存。
  • 异步处理@Async注解 + 自定义线程池。
    1. @Configuration
    2. @EnableAsync
    3. public class AsyncConfig {
    4. @Bean(name = "taskExecutor")
    5. public Executor taskExecutor() {
    6. ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    7. executor.setCorePoolSize(5);
    8. executor.setMaxPoolSize(10);
    9. return executor;
    10. }
    11. }

六、实战问题与解决方案

13. 如何解决Bean冲突?

14. 测试中如何模拟Bean?
使用@MockBean注解(Spring Boot Test):

  1. @SpringBootTest
  2. public class ServiceTest {
  3. @MockBean
  4. private UserRepository userRepository;
  5. @Autowired
  6. private UserService userService;
  7. @Test
  8. public void testFindUser() {
  9. when(userRepository.findById(1L)).thenReturn(new User(1L, "Test"));
  10. assertEquals("Test", userService.findUser(1L).getName());
  11. }
  12. }

15. 分布式事务解决方案

  • Seata:AT模式(自动生成回滚日志)。
  • RocketMQ事务消息:最终一致性方案。

七、源码与设计模式

16. Spring中常见的设计模式

  • 工厂模式:BeanFactory创建Bean。
  • 代理模式:AOP动态代理。
  • 模板方法模式:JdbcTemplate、RestTemplate。
  • 观察者模式:ApplicationContext的事件发布机制。

17. 如何阅读Spring源码?

  1. 从入口类(如DispatcherServlet)开始跟踪调用链。
  2. 关注核心接口(如BeanFactoryApplicationContext)。
  3. 使用调试工具(IntelliJ IDEA的Debug模式)单步执行。

18. 最新版本特性(如Spring 6/Spring Boot 3)

  • Java 17+支持:记录类(Record)作为Bean。
  • GraalVM原生镜像:减少启动时间。
  • AOT编译:提前编译优化。

总结

本文系统梳理了Spring面试中的18个核心问题,涵盖从基础原理到高级特性的全链路知识。建议读者结合实际项目经验,深入理解IoC/AOP、事务管理、性能优化等关键模块,同时关注Spring生态的最新动态(如响应式编程、AOT编译),以提升技术竞争力。

相关文章推荐

发表评论

活动