Spring面试18问:从基础到进阶的深度解析
2025.09.26 20:49浏览量:0简介:本文整理了Spring框架面试中常见的18个核心问题,涵盖IoC容器、AOP原理、事务管理、性能优化等关键模块,通过原理剖析+代码示例+最佳实践的组合形式,帮助开发者系统掌握Spring核心机制,提升面试通过率。
一、Spring核心概念与IoC容器
1. Spring框架的核心功能是什么?
Spring框架的核心功能可归纳为三点:IoC(控制反转)容器管理、AOP(面向切面编程)支持和声明式事务管理。IoC容器通过依赖注入(DI)实现对象生命周期的自动化管理,例如:
@Configurationpublic class AppConfig {@Beanpublic UserService userService() {return new UserServiceImpl(userRepository()); // 显式依赖注入}}
AOP通过动态代理技术实现横切关注点(如日志、安全)的模块化,而声明式事务通过@Transactional注解简化数据库操作。
2. Bean的生命周期包括哪些阶段?
完整的Bean生命周期包含7个关键阶段:实例化→属性注入→BeanNameAware.setBeanName()→BeanFactoryAware.setBeanFactory()→ApplicationContextAware.setApplicationContext()→BeanPostProcessor.postProcessBeforeInitialization()→InitializingBean.afterPropertiesSet()→@PostConstruct方法→BeanPostProcessor.postProcessAfterInitialization()→销毁(DisposableBean.destroy()或@PreDestroy方法)。
3. @Autowired与@Resource注解的区别?
| 特性 | @Autowired | @Resource |
|---|---|---|
| 来源 | Spring原生注解 | JSR-250标准注解 |
| 默认匹配策略 | 按类型(Type)匹配 | 按名称(Name)匹配 |
| 依赖注入方式 | 支持构造器/Setter/字段注入 | 仅支持字段/Setter注入 |
| 异常处理 | 找不到Bean时报错 | 可设置required=false |
二、AOP与事务管理
4. AOP的实现原理是什么?
Spring AOP基于动态代理技术,当目标类实现接口时使用JDK动态代理,否则使用CGLIB代理。关键组件包括:
- 切点(Pointcut):定义切入点表达式(如
execution(* com.example.service.*.*(..))) - 通知(Advice):@Before/@After/@Around等增强逻辑
- 切面(Aspect):切点+通知的组合
- 织入器(Adviser):将切面逻辑织入到目标方法
5. 声明式事务失效的常见原因?
事务失效的典型场景包括:
- 方法修饰符错误:非public方法事务不生效
- 异常处理不当:默认只回滚RuntimeException,需指定
@Transactional(rollbackFor=Exception.class) - 自调用问题:类内部方法调用不走代理,需通过ApplicationContext获取代理对象
- 数据库引擎不支持:如MyISAM引擎不支持事务
6. 事务传播行为有哪些?
Spring定义7种传播行为,核心场景如下:
- REQUIRED(默认):存在事务则加入,否则新建
- REQUIRES_NEW:总是新建事务,挂起当前事务
- NESTED:嵌套事务,外层回滚导致内层回滚,内层回滚不影响外层
@Transactional(propagation = Propagation.NESTED)public void nestedTransaction() {// 子事务可独立回滚}
三、数据访问与性能优化
7. JdbcTemplate的工作原理?
JdbcTemplate通过模板方法模式封装JDBC操作,核心流程:
- 创建PreparedStatement(参数绑定)
- 执行SQL并处理ResultSet
- 异常转换(SQLException→DataAccessException)
- 资源释放(Connection/Statement/ResultSet)
8. @Transactional注解的原理?
事务注解通过AOP实现,执行流程:
- 创建代理对象(JDK/CGLIB)
- 方法调用时触发
TransactionInterceptor - 获取事务定义(传播行为、隔离级别等)
- 调用
TransactionManager.getTransaction()开启事务 - 方法执行完成后根据异常类型决定提交或回滚
9. Spring Boot自动配置的原理?
自动配置基于@EnableAutoConfiguration注解,通过spring-boot-autoconfigure模块中的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件加载配置类。条件注解(如@ConditionalOnClass、@ConditionalOnMissingBean)实现精准配置。
四、进阶问题与最佳实践
10. 如何解决循环依赖问题?
Spring通过三级缓存解决循环依赖:
- SingletonObjects:完整Bean缓存
- EarlySingletonObjects:半成品Bean缓存
- SingletonFactories:ObjectFactory工厂缓存
构造器注入导致的循环依赖无法解决,需改用Setter注入。
11. 自定义Starter的步骤?
- 创建
autoconfigure模块,定义@Configuration类 - 添加
spring.factories文件声明自动配置类 - 使用
@Conditional注解控制配置生效条件 - 打包时指定
<classifier>spring-boot</classifier>
12. 性能优化建议?
- 懒加载:对非必要Bean使用
@Lazy - 缓存:集成Redis/Caffeine缓存
- 异步处理:使用
@Async注解 - 批量操作:JdbcTemplate的
batchUpdate() - 监控:集成Actuator暴露指标
五、高级特性与源码解析
13. Spring MVC的执行流程?
请求处理链:DispatcherServlet→HandlerMapping→HandlerAdapter→Controller→ViewResolver→View
关键组件:
- HandlerMapping:URL与Controller方法的映射
- HandlerAdapter:适配不同风格的Controller(如@RestController)
- ViewResolver:解析视图名称(Thymeleaf/JSP)
14. 事件监听机制的实现?
通过ApplicationEventPublisher发布事件,ApplicationListener监听事件。核心类:
- SimpleApplicationEventMulticaster:事件广播器
- AnnotationAsyncEventListener:异步事件处理
@EventListenerpublic void handleEvent(CustomEvent event) {// 事件处理逻辑}
15. 动态代理的选择策略?
Spring代理选择逻辑:
- 若目标类实现接口,优先使用JDK动态代理
- 否则使用CGLIB代理(需排除final类)
- 可通过
@EnableAspectJAutoProxy(proxyTargetClass = true)强制使用CGLIB
六、实战问题与解决方案
16. 如何解决N+1查询问题?
解决方案:
- Fetch Join:在JPA中使用
@EntityGraph - 批量查询:使用
in查询替代循环查询 - 二级缓存:集成Hibernate二级缓存
- DTO投影:只查询必要字段
17. 多数据源配置步骤?
- 定义多个
DataSourceBean - 配置对应的
SqlSessionFactory和TransactionManager - 使用
@Primary指定默认数据源 - 通过
@DataSource注解切换数据源@Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface DataSource {String value() default "primary";}
18. Spring Security的认证流程?
认证流程:
- 用户提交凭证(用户名/密码)
AuthenticationFilter拦截请求AuthenticationManager验证凭证- 生成
UsernamePasswordAuthenticationToken - 存入SecurityContextHolder
- 返回认证结果(成功/失败)
权限控制核心组件:
- SecurityMetadataSource:定义资源权限
- AccessDecisionManager:权限决策
- FilterSecurityInterceptor:权限拦截
本文通过18个核心问题的解析,系统梳理了Spring框架从基础到进阶的知识体系。建议开发者结合源码阅读(如DefaultListableBeanFactory、TransactionAspectSupport等核心类)和实际项目经验,深入理解设计原理。面试准备时,可重点掌握IoC容器初始化流程、AOP代理机制、事务传播行为等高频考点,同时关注Spring Boot 2.7+和Spring 6的新特性(如AOT编译、GraalVM支持)。

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