全部学科
Python全栈
python
NodeJS全栈
nodejs
📝 1 篇文章 20 道配套习题

Spring 源码级原理专题

专题说明

本专题深入分析Spring框架的源码实现原理,包括IoC容器启动流程、Bean生命周期源码分析、AOP代理创建机制、循环依赖三级缓存解决方案等核心内容。

学习目标

  1. 理解ApplicationContext的启动流程
  2. 掌握Bean生命周期的源码实现细节
  3. 了解AOP代理创建的源码机制
  4. 理解循环依赖的三级缓存解决方案

学习内容

  • IoC容器启动:refresh()方法核心流程
  • Bean生命周期:doCreateBean()源码分析
  • AOP代理创建:AnnotationAwareAspectJAutoProxyCreator
  • 循环依赖:三级缓存机制详解

学习建议

源码分析需要扎实的Java基础,建议结合IDE调试跟踪源码流程。重点理解核心类的设计思路,不必记忆每个细节。

📝 配套习题(20 题)

💡 参考答案在文末
判断题
1

Spring中的Aware接口(如BeanNameAware、ApplicationContextAware)的回调时机是在Bean实例化之后、属性赋值之前执行。

A

B

2

Spring AOP代理对象是在Bean实例化之前创建的。

A

B

3

Spring可以自动解决构造器注入产生的循环依赖问题。

A

B

单选题
4

Spring在检测到循环依赖时,会抛出哪个异常?

A

BeanCreationException

B

BeanCurrentlyInCreationException

C

CircularDependencyException

D

NoSuchBeanDefinitionException

5

Spring AOP代理对象方法被调用时,MethodInvocation的proceed()方法的作用是?

A

直接调用目标方法

B

执行下一个拦截器或目标方法

C

创建新的代理对象

D

解析切入点表达式

6

在Spring的AbstractAutowireCapableBeanFactory中,创建单例Bean的核心方法是doCreateBean(),以下是其执行顺序的正确描述?

A

createBeanInstance → populateBean → initializeBean → registerSingleton

B

createBeanInstance → initializeBean → populateBean → addSingleton

C

createBeanInstance → populateBean → initializeBean → addSingleton

D

populateBean → createBeanInstance → initializeBean → addSingleton

7

Spring解决单例Bean循环依赖的核心机制是三级缓存,其中第二级缓存的作用是?

A

存储完整的单例Bean实例

B

存储早期暴露的Bean实例(未完成属性赋值)

C

存储ObjectFactory用于生成代理对象

D

存储Bean的定义信息

8

Spring Bean生命周期的正确顺序是?

A

实例化 → 属性赋值 → 初始化 → 销毁

B

初始化 → 属性赋值 → 实例化 → 销毁

C

属性赋值 → 实例化 → 初始化 → 销毁

D

实例化 → 初始化 → 属性赋值 → 销毁

9

Spring支持的依赖注入方式不包括以下哪种?

A

构造器注入

B

Setter方法注入

C

字段注入

D

静态方法注入

10

Spring AOP默认使用哪种代理方式?

A

JDK动态代理

B

CGLIB代理

C

AspectJ编译时织入

D

根据目标类是否有接口自动选择

多选题
11

以下关于JDK动态代理和CGLIB代理的说法正确的是?

A

JDK动态代理只能代理接口

B

CGLIB通过继承目标类生成代理

C

JDK动态代理性能优于CGLIB

D

CGLIB无法代理final类和final方法

12

以下哪些方案可以解决构造器注入产生的循环依赖?

A

使用@Lazy注解延迟加载其中一个依赖

B

将构造器注入改为Setter注入

C

使用ApplicationContext手动获取Bean

D

重构代码,消除循环依赖

13

当一个接口有多个实现类时,@Autowired注入的匹配规则包括哪些?

A

按类型匹配所有候选Bean

B

按@Qualifier指定的名称匹配

C

按字段名或参数名匹配Bean名称

D

按@Primary标注的Bean优先匹配

14

以下哪些是Spring Bean生命周期中会执行的回调方法?

A

@PostConstruct标注的方法

B

InitializingBean接口的afterPropertiesSet()方法

C

@Bean注解的initMethod属性指定的方法

D

BeanPostProcessor的postProcessBeforeInitialization()方法

填空题
15

Spring处理@Autowired注解的核心类是____________,它实现了____________接口用于收集注入元数据,在属性注入阶段通过____________方法完成依赖查找和注入。

16

Spring DefaultSingletonBeanRegistry中,三级缓存的Map字段分别是:一级缓存singletonObjects存储____________,二级缓存earlySingletonObjects存储____________,三级缓存singletonFactories存储____________用于获取早期Bean引用。

17

Spring容器启动的核心流程在AbstractApplicationContext的refresh()方法中,主要包括:obtainFreshBeanFactory()获取____________,invokeBeanFactoryPostProcessors()执行____________,registerBeanPostProcessors()注册____________,finishBeanFactoryInitialization()完成非懒加载Bean的初始化。

18

BeanPostProcessor是Spring框架的重要扩展点,它有两个方法:____________在初始化方法之前执行,____________在初始化方法之后执行。Spring AOP的____________就是在postProcessAfterInitialization方法中完成的。

19

Spring AOP代理创建的核心类是____________,它实现了____________接口。在postProcessAfterInitialization方法中调用wrapIfNecessary方法判断是否需要创建代理,最终通过____________创建代理对象。

20

在Spring AOP中,通过AopContext.currentProxy()可以获取当前代理对象,这需要在____________注解中设置exposeProxy=true,或配置spring.aop.auto.proxy-target-class属性。内部通过____________存储当前线程的代理对象引用,解决____________时代理失效问题。

参考答案
1.错误 2.错误 3.错误 4.B 5.B 6.C 7.B 8.A 9.D 10.D 11.A;B;D 12.A;B;C;D 13.A;B;C;D 14.A;B;C;D 15.AutowiredAnnotationBeanPostProcessor;MergedBeanDefinitionPostProcessor;resolveDependency 16.完整的单例Bean;早期暴露的Bean对象;ObjectFactory 17.BeanFactory;BeanFactoryPostProcessor;BeanPostProcessor 18.postProcessBeforeInitialization;postProcessAfterInitialization;动态代理 19.AbstractAutoProxyCreator;SmartInstantiationAwareBeanPostProcessor;ProxyFactory 20.@EnableAspectJAutoProxy;ThreadLocal;同类内部调用
想在手机上练习这套专题?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码
← 上一个专题 Spring 数据访问基础专题
下一个专题 → Spring入门基础专题
扫码体验小程序
加载中
想在手机上刷题学习?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码