logo

Spring面试18问:从基础到进阶的深度解析

作者:宇宙中心我曹县2025.09.26 20:49浏览量:0

简介:本文整理了Spring框架面试中常见的18个核心问题,涵盖IoC容器、AOP原理、事务管理、性能优化等关键模块,通过原理剖析+代码示例+最佳实践的组合形式,帮助开发者系统掌握Spring核心机制,提升面试通过率。

一、Spring核心概念与IoC容器

1. Spring框架的核心功能是什么?

Spring框架的核心功能可归纳为三点:IoC(控制反转)容器管理AOP(面向切面编程)支持声明式事务管理。IoC容器通过依赖注入(DI)实现对象生命周期的自动化管理,例如:

  1. @Configuration
  2. public class AppConfig {
  3. @Bean
  4. public UserService userService() {
  5. return new UserServiceImpl(userRepository()); // 显式依赖注入
  6. }
  7. }

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. 声明式事务失效的常见原因?

事务失效的典型场景包括:

  1. 方法修饰符错误:非public方法事务不生效
  2. 异常处理不当:默认只回滚RuntimeException,需指定@Transactional(rollbackFor=Exception.class)
  3. 自调用问题:类内部方法调用不走代理,需通过ApplicationContext获取代理对象
  4. 数据库引擎不支持:如MyISAM引擎不支持事务

6. 事务传播行为有哪些?

Spring定义7种传播行为,核心场景如下:

  • REQUIRED(默认):存在事务则加入,否则新建
  • REQUIRES_NEW:总是新建事务,挂起当前事务
  • NESTED:嵌套事务,外层回滚导致内层回滚,内层回滚不影响外层
    1. @Transactional(propagation = Propagation.NESTED)
    2. public void nestedTransaction() {
    3. // 子事务可独立回滚
    4. }

三、数据访问与性能优化

7. JdbcTemplate的工作原理?

JdbcTemplate通过模板方法模式封装JDBC操作,核心流程:

  1. 创建PreparedStatement(参数绑定)
  2. 执行SQL并处理ResultSet
  3. 异常转换(SQLException→DataAccessException)
  4. 资源释放(Connection/Statement/ResultSet)

8. @Transactional注解的原理?

事务注解通过AOP实现,执行流程:

  1. 创建代理对象(JDK/CGLIB)
  2. 方法调用时触发TransactionInterceptor
  3. 获取事务定义(传播行为、隔离级别等)
  4. 调用TransactionManager.getTransaction()开启事务
  5. 方法执行完成后根据异常类型决定提交或回滚

9. Spring Boot自动配置的原理?

自动配置基于@EnableAutoConfiguration注解,通过spring-boot-autoconfigure模块中的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件加载配置类。条件注解(如@ConditionalOnClass@ConditionalOnMissingBean)实现精准配置。

四、进阶问题与最佳实践

10. 如何解决循环依赖问题?

Spring通过三级缓存解决循环依赖:

  1. SingletonObjects:完整Bean缓存
  2. EarlySingletonObjects:半成品Bean缓存
  3. SingletonFactories:ObjectFactory工厂缓存

构造器注入导致的循环依赖无法解决,需改用Setter注入。

11. 自定义Starter的步骤?

  1. 创建autoconfigure模块,定义@Configuration
  2. 添加spring.factories文件声明自动配置类
  3. 使用@Conditional注解控制配置生效条件
  4. 打包时指定<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:异步事件处理
    1. @EventListener
    2. public void handleEvent(CustomEvent event) {
    3. // 事件处理逻辑
    4. }

15. 动态代理的选择策略?

Spring代理选择逻辑:

  1. 若目标类实现接口,优先使用JDK动态代理
  2. 否则使用CGLIB代理(需排除final类)
  3. 可通过@EnableAspectJAutoProxy(proxyTargetClass = true)强制使用CGLIB

六、实战问题与解决方案

16. 如何解决N+1查询问题?

解决方案:

  1. Fetch Join:在JPA中使用@EntityGraph
  2. 批量查询:使用in查询替代循环查询
  3. 二级缓存:集成Hibernate二级缓存
  4. DTO投影:只查询必要字段

17. 多数据源配置步骤?

  1. 定义多个DataSource Bean
  2. 配置对应的SqlSessionFactoryTransactionManager
  3. 使用@Primary指定默认数据源
  4. 通过@DataSource注解切换数据源
    1. @Target({ElementType.METHOD, ElementType.TYPE})
    2. @Retention(RetentionPolicy.RUNTIME)
    3. public @interface DataSource {
    4. String value() default "primary";
    5. }

18. Spring Security的认证流程?

认证流程:

  1. 用户提交凭证(用户名/密码)
  2. AuthenticationFilter拦截请求
  3. AuthenticationManager验证凭证
  4. 生成UsernamePasswordAuthenticationToken
  5. 存入SecurityContextHolder
  6. 返回认证结果(成功/失败)

权限控制核心组件:

  • SecurityMetadataSource:定义资源权限
  • AccessDecisionManager:权限决策
  • FilterSecurityInterceptor:权限拦截

本文通过18个核心问题的解析,系统梳理了Spring框架从基础到进阶的知识体系。建议开发者结合源码阅读(如DefaultListableBeanFactory、TransactionAspectSupport等核心类)和实际项目经验,深入理解设计原理。面试准备时,可重点掌握IoC容器初始化流程、AOP代理机制、事务传播行为等高频考点,同时关注Spring Boot 2.7+和Spring 6的新特性(如AOT编译、GraalVM支持)。

相关文章推荐

发表评论

活动