Spring面试18问:核心知识体系与实战要点全解析
2025.09.26 20:48浏览量:1简介:本文梳理Spring面试高频问题,涵盖IoC/AOP原理、Bean生命周期、事务管理、性能优化等核心模块,结合代码示例与最佳实践,助力开发者系统掌握Spring技术栈。
一、基础概念与核心原理
1. Spring IoC与DI的实现机制是什么?
IoC(控制反转)通过依赖注入(DI)实现对象间解耦。Spring容器管理Bean的生命周期,开发者通过配置(XML/注解)声明依赖关系。例如:
@Configurationpublic class AppConfig {@Beanpublic UserService userService(UserRepository repo) { // 构造器注入return new UserServiceImpl(repo);}}
关键点:
- 容器通过反射创建Bean实例。
- 支持构造器注入、Setter注入、字段注入(不推荐)。
- 循环依赖通过三级缓存(SingletonObjects、EarlySingletonObjects、SingletonFactories)解决。
2. AOP的实现原理及应用场景
AOP通过动态代理(JDK动态代理/CGLIB)实现横切关注点分离。典型场景包括日志、事务、安全等。示例:
@Aspect@Componentpublic class LoggingAspect {@Before("execution(* com.example.service.*.*(..))")public void logMethodCall(JoinPoint joinPoint) {System.out.println("Method called: " + joinPoint.getSignature());}}
原理:
- JDK动态代理要求目标类实现接口,CGLIB通过继承目标类生成代理。
- 切点表达式(Pointcut)定义拦截规则,通知(Advice)定义执行时机。
二、Bean管理与生命周期
3. Bean的作用域及使用场景
- Singleton:默认作用域,单例模式(如Service层组件)。
- Prototype:每次请求创建新实例(如DTO对象)。
- Request/Session:Web环境专用,分别对应HTTP请求和会话周期。
配置示例:
@Bean@Scope("prototype")public OrderProcessor orderProcessor() {return new OrderProcessor();}
4. Bean的生命周期回调方法
通过接口或注解定义回调:
InitializingBean接口的afterPropertiesSet()方法。@PostConstruct注解。DisposableBean接口的destroy()方法。@PreDestroy注解。
执行顺序:构造器 → @PostConstruct → afterPropertiesSet() → 自定义init方法 → 销毁时反向执行。
5. 循环依赖的解决方案
Spring通过三级缓存解决:
- SingletonFactories:存储Bean工厂对象(ObjectFactory)。
- EarlySingletonObjects:存储提前曝光的半成品Bean。
- 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:完全串行化。
配置示例:
@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_COMMITTED)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的执行流程
- DispatcherServlet接收请求。
- HandlerMapping定位控制器方法。
- HandlerAdapter调用方法并处理参数绑定。
- ViewResolver解析视图(如Thymeleaf/JSP)。
- 返回响应。
关键注解:
@Controller:标记控制器类。@RequestMapping:定义URL映射。@ResponseBody:直接返回JSON/XML(需Jackson支持)。
9. 拦截器(Interceptor)与过滤器(Filter)的区别
| 特性 | 拦截器 | 过滤器 |
|——————————|——————————————|——————————————|
| 依赖框架 | Spring MVC | Servlet规范 |
| 执行顺序 | 控制器方法前后 | 请求进入Servlet容器前后 |
| 访问范围 | 可获取HandlerMethod信息 | 仅能访问HttpServletRequest |
配置示例:
public class AuthInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) {return req.getSession().getAttribute("user") != null;}}
五、高级特性与优化
10. Spring Boot自动配置原理
通过@EnableAutoConfiguration注解触发,依赖spring-boot-autoconfigure模块中的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,按条件(@Conditional)加载配置类。例如:
@Configuration@ConditionalOnClass(DataSource.class)public class DataSourceAutoConfiguration { ... }
11. 响应式编程(WebFlux)适用场景
- 高并发、低延迟需求(如实时聊天)。
- 非阻塞I/O模型,基于Reactor库。
示例:
@GetMapping("/stream")public Flux<String> streamEvents() {return Flux.interval(Duration.ofSeconds(1)).map(i -> "Event-" + i);}
12. 性能优化建议
- Bean懒加载:
@Lazy注解减少启动时间。 - 缓存配置:
@Cacheable+ Redis缓存。 - 异步处理:
@Async注解 + 自定义线程池。@Configuration@EnableAsyncpublic class AsyncConfig {@Bean(name = "taskExecutor")public Executor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(5);executor.setMaxPoolSize(10);return executor;}}
六、实战问题与解决方案
13. 如何解决Bean冲突?
- 使用
@Primary指定默认Bean。 - 使用
@Qualifier明确指定Bean名称。@Bean@Qualifier("customDataSource")public DataSource customDataSource() { ... }
14. 测试中如何模拟Bean?
使用@MockBean注解(Spring Boot Test):
@SpringBootTestpublic class ServiceTest {@MockBeanprivate UserRepository userRepository;@Autowiredprivate UserService userService;@Testpublic void testFindUser() {when(userRepository.findById(1L)).thenReturn(new User(1L, "Test"));assertEquals("Test", userService.findUser(1L).getName());}}
15. 分布式事务解决方案
- Seata:AT模式(自动生成回滚日志)。
- RocketMQ事务消息:最终一致性方案。
七、源码与设计模式
16. Spring中常见的设计模式
- 工厂模式:BeanFactory创建Bean。
- 代理模式:AOP动态代理。
- 模板方法模式:JdbcTemplate、RestTemplate。
- 观察者模式:ApplicationContext的事件发布机制。
17. 如何阅读Spring源码?
- 从入口类(如
DispatcherServlet)开始跟踪调用链。 - 关注核心接口(如
BeanFactory、ApplicationContext)。 - 使用调试工具(IntelliJ IDEA的Debug模式)单步执行。
18. 最新版本特性(如Spring 6/Spring Boot 3)
- Java 17+支持:记录类(Record)作为Bean。
- GraalVM原生镜像:减少启动时间。
- AOT编译:提前编译优化。
总结
本文系统梳理了Spring面试中的18个核心问题,涵盖从基础原理到高级特性的全链路知识。建议读者结合实际项目经验,深入理解IoC/AOP、事务管理、性能优化等关键模块,同时关注Spring生态的最新动态(如响应式编程、AOT编译),以提升技术竞争力。

发表评论
登录后可评论,请前往 登录 或 注册