Spring 6.2 EOL在即,根猫AI助手梳理核心面试考点

小编 1 0

目标读者:技术入门/进阶学习者、在校学生、面试备考者、相关技术栈开发工程师

北京时间:2026年4月9日


在Java企业级开发领域,Spring框架长期占据不可撼动的核心地位。据统计,

超过70%的Java后端岗位面试中必问Spring相关原理Spring Framework 6.2版本将于2026年6月进入EOL(生命周期终止) ,Spring 7.x将取而代之,社区将不再为6.2提供安全补丁、缺陷修复和功能更新-1。许多学习者在Spring的学习中面临共同痛点:会用注解完成日常开发,却说不上IoC和DI的区别;能写出AOP切面代码,却讲不清底层代理机制;面对“Bean生命周期”这类高频考题时表述混乱、逻辑不清——这恰恰是面试官最看重的“知其所以然”的深度。

本文由“根猫AI助手”驱动资料与内容梳理,将从问题驱动→概念拆解→代码对比→原理剖析→面试要点五个层次,系统讲解Spring框架的四大核心知识点:IoC与DI、AOP、Bean生命周期、自动配置原理,帮助读者建立完整知识链路,在技术面试中游刃有余。


一、痛点切入:为什么需要Spring?

传统开发方式的痛点

先来看一段传统Java Web开发中的代码示例:

java
复制
下载
public class UserController {
    // 直接在Controller中new Service对象
    private UserService userService = new UserService();
    
    public void handleRequest() {
        userService.doBusiness();
    }
}

public class UserService {
    private UserDao userDao = new UserDao();
    
    public void doBusiness() {
        userDao.save();
    }
}

这段代码暴露了三个典型问题:

  1. 强耦合:各层之间直接new依赖对象,一旦需要更换实现类,必须修改所有引用处。

  2. 难以测试:无法在单元测试中注入Mock对象,测试必须依赖真实依赖。

  3. 代码冗余:每个类都要手动管理依赖的创建,违背DRY(Don‘t Repeat Yourself)原则。

Spring的设计初衷

Spring框架正是为解决上述问题而生。其核心理念是:将对象的创建和依赖关系的管理从应用程序代码中分离出来,交由容器统一管理——这就是控制反转(IoC)思想,而容器将依赖对象注入到目标对象中的具体方式,称为依赖注入(DI)-11


二、核心概念讲解:控制反转(IoC)

标准定义

IoC(Inversion of Control,控制反转) 是一种设计原则,它将对象的创建、组装和生命周期管理的控制权从程序代码本身转移到外部容器。

关键词拆解

  • “控制” :指的是对象的创建权、依赖关系的配置权、对象生命周期的管理权。

  • “反转” :与传统编程中程序主动new对象相反,程序被动地从容器获取所需对象。

生活化类比

可以把IoC理解成餐厅点餐。传统方式就像你去后厨自己洗菜、切菜、炒菜——你需要知道每一步怎么做。而有了IoC容器后,你只需要坐在座位上点餐(声明依赖),服务员(容器)会把你点的菜(依赖对象)送到你面前——你无需关心菜是怎么做的,只需专注享用-

在Spring中的价值

IoC使组件之间的耦合度大幅降低,每个组件只需关注自身业务逻辑,无需管理依赖的创建和生命周期,显著提升了代码的可维护性、可测试性和可扩展性。


三、关联概念讲解:依赖注入(DI)

标准定义

DI(Dependency Injection,依赖注入) 是IoC的具体实现方式,指容器在运行时动态地将依赖对象注入到目标对象的属性、构造方法或Setter方法中。

三种注入方式

注入方式代码示例特点推荐程度
构造器注入@Autowired public UserController(UserService userService) {}保证依赖不可变,便于单元测试⭐⭐⭐⭐⭐
Setter注入@Autowired public void setUserService(UserService userService) {}允许依赖可选,可在运行时重新注入⭐⭐⭐
字段注入@Autowired private UserService userService;代码最简洁,但不易测试⭐⭐

构造器注入是官方推荐的注入方式,因为它能保证依赖对象的不可变性,并且方便编写单元测试(可直接传入Mock对象)-

使用示例

java
复制
下载
@RestController
public class UserController {
    // 构造器注入(推荐)
    private final UserService userService;
    
    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }
    
    @GetMapping("/user/{id}")
    public User getUser(@PathVariable Long id) {
        return userService.findById(id);
    }
}

四、概念关系与区别总结:IoC vs DI

这是面试中最容易混淆的一组概念。一句话概括:

IoC是设计思想,DI是实现手段。IoC回答“谁控制谁”,DI回答“怎么控制”。

维度IoC(控制反转)DI(依赖注入)
本质一种设计思想/原则一种具体的技术实现
关注点控制权的转移(谁来创建对象)依赖关系的传递(如何把依赖给出去)
在Spring中Spring容器的设计理念实现Ioc的具体方式
关系是目标是手段

一句话记忆:IoC是“交权”,DI是“输血”。


五、代码示例:IoC与DI的完整实践

下面用一个完整的分层解耦示例,展示从“传统方式”到“Spring方式”的转变。

步骤1:定义接口(解耦的基础)

java
复制
下载
// 服务接口
public interface UserService {
    User findById(Long id);
}

// 数据访问接口
public interface UserDao {
    User getById(Long id);
}

步骤2:实现类并用注解声明为Bean

java
复制
下载
@Service  // 将UserServiceImpl交给IoC容器管理
public class UserServiceImpl implements UserService {
    @Autowired  // 自动注入UserDao依赖
    private UserDao userDao;
    
    @Override
    public User findById(Long id) {
        return userDao.getById(id);
    }
}

@Repository  // 数据访问层,交给IoC容器管理
public class UserDaoImpl implements UserDao {
    @Override
    public User getById(Long id) {
        // 模拟数据库查询
        return new User(id, "张三");
    }
}

步骤3:Controller层注入并使用

java
复制
下载
@RestController
public class UserController {
    @Autowired
    private UserService userService;
    
    @GetMapping("/user/{id}")
    public User getUser(@PathVariable Long id) {
        return userService.findById(id);
    }
}

关键步骤解析

  1. @Service@Repository@Controller@Component的衍生注解,用于声明该类为IoC容器中的Bean-11

  2. @Autowired 按类型自动注入依赖,如果同类型有多个Bean,可用@Primary@Qualifier指定-11

  3. 组件扫描@SpringBootApplication包含了@ComponentScan,默认扫描启动类所在包及其子包-11


六、扩展核心:面向切面编程(AOP)

标准定义

AOP(Aspect-Oriented Programming,面向切面编程) 是Spring框架的另一大核心技术,它通过将横切关注点(如日志记录、事务管理、安全控制)与核心业务逻辑分离,以声明式方式在不修改原有代码的情况下增强类的行为-

AOP的应用场景

  • 日志记录:在方法调用前后记录入参、返回值和执行时间-

  • 事务管理:将多个数据库操作封装成一个事务,确保数据一致性-

  • 性能监控:统计方法执行时间,识别性能瓶颈

  • 权限校验:在方法执行前进行身份认证和权限验证

代码示例:日志切面

java
复制
下载
@Aspect
@Component
public class LoggingAspect {
    
    // 定义切点:匹配com.example.service包下所有类的所有方法
    @Pointcut("execution( com.example.service..(..))")
    public void serviceMethods() {}
    
    // 前置通知:方法执行前记录日志
    @Before("serviceMethods()")
    public void logBefore(JoinPoint joinPoint) {
        System.out.println("【AOP】调用方法:" + joinPoint.getSignature().getName());
    }
    
    // 后置通知:方法正常返回后记录
    @AfterReturning(pointcut = "serviceMethods()", returning = "result")
    public void logAfterReturning(JoinPoint joinPoint, Object result) {
        System.out.println("【AOP】方法返回:" + result);
    }
}

七、底层原理:AOP的代理机制

Spring AOP的核心实现依赖于代理模式。根据目标类是否实现接口,Spring会选择不同的代理方式:

代理类型适用场景实现原理特点
JDK动态代理目标类实现了至少一个接口基于反射机制动态生成接口的代理类必须基于接口,性能较好
CGLIB代理目标类没有实现任何接口通过字节码技术生成目标类的子类可以代理没有接口的类,不能代理final方法

一句话总结:有接口用JDK代理,无接口用CGLIB代理-21

AOP底层依赖的Java反射机制正是动态代理的核心支撑,Spring通过反射在运行时动态生成代理对象,拦截目标方法调用并织入增强逻辑。


八、Bean生命周期(面试高频考点)

生命周期完整流程

Spring Bean的生命周期可以划分为5个核心阶段:

text
复制
下载
实例化 → 属性注入 → 初始化前扩展(Aware接口) → 初始化 → 销毁
阶段关键动作扩展点
1. 实例化调用构造函数创建Bean对象BeanPostProcessor
2. 属性注入@Autowired依赖注入InstantiationAwareBeanPostProcessor
3. Aware接口注入容器相关资源BeanNameAwareBeanFactoryAware
4. 初始化执行@PostConstruct方法、InitializingBean接口BeanPostProcessor.postProcessBeforeInitialization
5. 销毁容器关闭前执行@PreDestroy方法DisposableBean接口

面试关键区分:实例化 vs 初始化

  • 实例化:通过构造函数创建对象(此时依赖尚未注入)

  • 初始化:在属性注入完成后执行自定义初始化逻辑(@PostConstruct在这个阶段执行)-


九、Spring Boot自动配置原理

是什么

自动配置(Auto-Configuration) 是Spring Boot“开箱即用”的核心机制:根据项目中引入的依赖和当前环境,自动为应用配置Spring Bean,无需手动编写XML或大量Java配置-44

核心流程

text
复制
下载
@SpringBootApplication(组合注解)

@EnableAutoConfiguration(核心开关)

AutoConfigurationImportSelector(调度中心)

读取 META-INF/spring/.../AutoConfiguration.imports(自动配置类列表)

加载自动配置类并进行@Conditional条件判断

满足条件的配置类生效,注册Bean到容器

关键机制:条件注解

自动配置类通过条件注解实现按需加载,最常用的是@ConditionalOnMissingBean——如果容器中还没有某个类型的Bean,才自动创建,保证开发者可以覆盖默认配置-44

java
复制
下载
@Configuration
@ConditionalOnClass(DataSource.class)
public class DataSourceAutoConfiguration {
    @Bean
    @ConditionalOnMissingBean
    public DataSource dataSource() {
        return new HikariDataSource();  // 用户没配置时才自动创建
    }
}

十、高频面试题与参考答案

面试题1:IoC和DI的区别是什么?

参考答案
IoC(控制反转)是一种设计思想,指将对象的创建和依赖管理的控制权从程序代码转移到外部容器。DI(依赖注入)是实现IoC的具体手段,指容器在运行时动态地将依赖对象注入到目标对象中。简单来说:IoC是思想,DI是实现。 -

面试题2:Spring AOP的底层原理是什么?

参考答案
Spring AOP基于代理模式实现。当目标类实现了接口时,使用JDK动态代理,基于反射生成接口的代理类;当目标类没有实现接口时,使用CGLIB代理,通过字节码技术生成目标类的子类。AOP的核心是动态代理 + 拦截器链,在运行时将横切逻辑织入目标方法中-21

面试题3:Spring Bean的生命周期包含哪些阶段?

参考答案
5个核心阶段:实例化(构造函数创建对象)→ 属性注入(@Autowired注入依赖)→ Aware接口注入(BeanNameAware等)→ 初始化(@PostConstruct执行)→ 销毁(@PreDestroy执行)。重点区分:实例化是new对象,初始化是注入完成后的自定义逻辑。 -

面试题4:Spring Boot自动配置是如何实现的?

参考答案
核心机制是@EnableAutoConfiguration注解,它通过AutoConfigurationImportSelectorMETA-INF/spring/.../AutoConfiguration.imports文件中加载所有自动配置类,然后利用条件注解(如@ConditionalOnClass@ConditionalOnMissingBean)按需判断哪些配置生效,最终将满足条件的Bean注册到容器中-44

面试题5:如何解决@Autowired注入时多个同类型Bean的冲突?

参考答案
三种方案:①在被选中的Bean实现类上加@Primary指定优先候选;②在@Autowired旁配合@Qualifier(“beanName”)指定Bean名称;③使用JDK的@Resource(name=“beanName”)注解,它默认按名称注入-11


十一、结尾总结

核心知识点回顾

知识点一句话总结面试考频
IoC vs DIIoC是思想,DI是实现⭐⭐⭐⭐⭐
AOP原理基于代理模式,JDK动态代理(有接口)+ CGLIB(无接口)⭐⭐⭐⭐
Bean生命周期实例化→属性注入→Aware→初始化→销毁⭐⭐⭐⭐⭐
自动配置原理条件注解+AutoConfigurationImportSelector加载⭐⭐⭐⭐

易错点提醒

  1. 不要混淆IoC和DI:记住“思想 vs 实现”的区别。

  2. 区分实例化和初始化:实例化是创建对象,初始化是依赖注入后的自定义逻辑。

  3. AOP代理方式的选择:有接口用JDK动态代理,无接口用CGLIB。

进阶预告

下一篇我们将深入讲解Spring事务管理的底层原理,包括@Transactional的失效场景、事务传播行为详解以及如何在复杂业务中正确使用分布式事务。敬请期待!


本文由根猫AI助手整合多篇权威技术资料撰写,力求内容准确、逻辑清晰,适合技术学习与面试备考。如有任何疑问,欢迎留言交流~