Spring IoC 与 AOP

共 32 题
#

1. @Autowired 的依赖解析流程如何按类型匹配,多个候选 Bean 时怎样经 @Qualifier 与按名称回退确定最终注入对象

A 只要存在多个候选 Bean,就必然抛出 NoUniqueBeanDefinitionException
B 优先级顺序是 @Qualifier 优先于 @Primary,其次是按名称回退 ✓ 正确答案
C @Qualifier 与按名称回退等价,二者使用同一套解析逻辑
D 优先级顺序是 @Primary 优先于 @Qualifier,最后才按字段名回退
#

2. @ConditionalOnClass/@ConditionalOnMissingBean/@ConditionalOnProperty 的评估顺序与失效边界

A @ConditionalOnClass 优先于 @ConditionalOnBean 优先于 @ConditionalOnProperty ✓ 正确答案
B @ConditionalOnProperty 优先于 @ConditionalOnClass 评估
C 三个条件注解可以任意顺序并行评估,互不影响
D @ConditionalOnMissingBean 优先于 @ConditionalOnClass 评估
#

3. @Import 三种用法(普通类、ImportSelector、ImportBeanDefinitionRegistrar)

A ImportSelector 只能静态导入,无法基于注解元数据决策
B ImportBeanDefinitionRegistrar 只能导入类名,不能编程式注册 BeanDefinition
C 普通类导入、ImportSelector、ImportBeanDefinitionRegistrar 分别对应静态注册、动态选择、编程式注册,灵活性递增 ✓ 正确答案
D DeferredImportSelector 与普通 ImportSelector 行为完全相同
#

4. @Primary 与 Bean 优先级的关系

A @Primary 优先于 @Qualifier,与后者冲突时以 @Primary 为准
B @Primary 与 @Qualifier 等价,可以互换使用
C @Qualifier 显式指定优先于 @Primary 标记 ✓ 正确答案
D @Primary 只对字段注入生效,对构造器注入无效
#

5. @Profile 与多环境 Bean 注册

A @Profile 配合激活的 profile 进行条件注册,未标@Profile的 Bean 始终注册 ✓ 正确答案
B 未激活任何 profile 时,所有 @Profile 标注的 Bean 都不会注册
C @Profile 只能在类上使用,不能用在 @Bean 方法上
D @Profile 只影响 Bean 的实例化,不影响配置文件的加载
#

6. AOP 与 @Transactional 的协作边界

A @Transactional 通过字节码改写直接嵌入方法体,不依赖代理
B 事务通过 AOP 代理生效,一旦走 this 自调用,代理拦截不到会导致事务失效 ✓ 正确答案
C @Transactional 对 private 方法同样生效,因为代理可见
D 事务拦截与 AOP 无关,是数据库层独立实现的
#

7. AOP 与 final 方法的限制(无法代理)

A JDK 动态代理同样无法代理 final 方法,因为接口方法默认是 final
B CGLIB 通过子类继承覆写方法,final 方法无法被覆写,因此无法被代理 ✓ 正确答案
C final 类可以被 CGLIB 代理,因为 CGLIB 不依赖继承
D static 方法可以通过 CGLIB 代理生效
#

8. AOP 在事务管理、日志、安全等横切关注点的应用

A AOP 只能用于事务管理,不能用于日志与安全
B AOP 通过切面把横切逻辑从业务中抽出,实现关注点分离与统一维护 ✓ 正确答案
C AOP 需要业务代码显式调用切面逻辑才能生效
D AOP 与日志、安全、缓存无关,属于独立技术
#

9. AOP 核心概念(切面、连接点、通知、切入点、引入、目标对象)

A 切入点(Pointcut)是实际执行通知的地方,连接点(Join Point)是匹配表达式
B 切面(Aspect)由切入点(决定织入位置)和通知(决定织入动作)组成 ✓ 正确答案
C 通知只有 Before 和 After 两种类型
D 引入(Introduction)是修改目标对象字节码以增加方法
#

10. ApplicationContext 与 BeanFactory 的差异

A BeanFactory 预加载单例 Bean,ApplicationContext 采用懒加载
B 两者功能完全等价,ApplicationContext 只是 BeanFactory 的另一个名字
C ApplicationContext 是 BeanFactory 的增强版,额外提供事件、国际化、资源加载等能力 ✓ 正确答案
D BeanFactory 支持事件发布,ApplicationContext 不支持
#

11. ApplicationContext.getBeansOfType 与运行时类型查找

A getBeansOfType 只能返回一个 Bean,且必须指定名称
B getBeansOfType 按类型返回所有匹配 Bean 的 Map,支持多实现运行时聚合 ✓ 正确答案
C getBeansOfType 与 getBean 完全等价
D getBeansOfType 只能按名称查找,不能按类型
#

12. ApplicationContextAware/BeanNameAware 的应用场景

A ApplicationContextAware 在 Bean 销毁阶段才被调用
B Aware 回调发生在 Bean 被 GC 回收之后
C BeanNameAware 让 Bean 获得自身在容器中的注册名称,在初始化阶段通过回调注入 ✓ 正确答案
D Aware 接口与 Bean 生命周期无关,仅用于测试
#

13. AspectJ 的静态织入与 Spring AOP 的运行时织入对比

A Spring AOP 能代理 final 方法和静态方法,AspectJ 不能
B AspectJ 只能拦截方法,且拦截范围小于 Spring AOP
C 两者都可以在运行时动态生成代理,能力完全相同
D AspectJ 采用静态织入,可织入字段、构造器、静态方法,能力更强但需 ajc 或 LTW ✓ 正确答案
#

14. Bean 的作用域(Singleton/Prototype/Request/Session/Application)

A Singleton 作用域每次注入都新建实例
B Request/Session/Application 作用域仅在 Web 容器环境下生效 ✓ 正确答案
C Prototype 作用域的 Bean 由容器负责完整生命周期管理,销毁时也会回调
D 只有 Singleton 一种作用域,其他都是 Deprecated
#

15. Bean 的生命周期与扩展点(InitializingBean/DisposableBean/BeanPostProcessor)

A BeanPostProcessor 是容器级扩展点,作用于所有 Bean,AOP 代理在 postProcessAfterInitialization 阶段生成 ✓ 正确答案
B BeanPostProcessor.postProcessAfterInitialization 在所有 Bean 初始化完成之后执行
C InitializingBean.afterPropertiesSet 在属性填充之前执行
D @PreDestroy 在 Bean 实例化时执行
#

16. BeanDefinition 从注册、合并(MergedBeanDefinition)到属性解析经历了哪些阶段,BeanFactoryPostProcessor 在哪一步介入

A BeanFactoryPostProcessor 在 Bean 实例化之后修改 Bean 实例
B BeanDefinition 的合并发生在 Bean 实例化之后
C BeanFactoryPostProcessor 在 Bean 实例化前对 BeanDefinition 生效,早于 BeanPostProcessor ✓ 正确答案
D BeanFactoryPostProcessor 与 BeanPostProcessor 作用时机完全相同
#

17. BeanPostProcessor 与 BeanFactoryPostProcessor 的执行顺序

A BeanFactoryPostProcessor 作用于 BeanDefinition,先于 Bean 实例化执行;BeanPostProcessor 作用于 Bean 实例,在实例化过程中执行 ✓ 正确答案
B BeanPostProcessor 先于 BeanFactoryPostProcessor 执行
C 两者都作用于 Bean 实例,执行顺序随机
D 两者都作用于 BeanDefinition,执行顺序无关
#

18. FactoryBean 与普通 Bean 的差异

A FactoryBean 的 getObject 返回的对象就是 FactoryBean 本身
B FactoryBean 与普通 Bean 完全等价
C 通过 &beanName 获取 FactoryBean 本身,通过 beanName 获取 getObject 返回的对象 ✓ 正确答案
D FactoryBean 只能创建单例对象
#

19. IoC 与 DI 的本质、容器职责与对象生命周期

A IoC 与 DI 是同一概念,没有区别
B IoC 容器只负责创建对象,不管理生命周期
C DI 是 IoC 的一种实现方式,IoC 是控制权反转的设计思想 ✓ 正确答案
D DI 意味着对象自己创建依赖对象
#

20. JDK 25 虚拟线程下 AOP 性能评估

A 虚拟线程会显著降低 AOP 代理的反射开销
B AOP 开销主要来自代理分发与反射,与线程模型无关,虚拟线程不改变其基准开销 ✓ 正确答案
C 虚拟线程下 AOP 代理完全失效
D 虚拟线程只能用于非 AOP 场景
#

21. OnBeanCondition 在多个候选 Bean 时按类型/名称匹配的策略细节

A 多候选时要求所有候选都匹配才成立
B 只支持按名称匹配,不支持按类型
C 按类型/名称做存在性判断,只要存在一个匹配 Bean 即满足条件 ✓ 正确答案
D 它判断的是 Bean 实例而非 BeanDefinition
#

22. Spring AOP 与 Spring Modulith 的边界

A Spring Modulith 关注模块化架构与边界,AOP 关注横切织入,二者维度不同 ✓ 正确答案
B Spring Modulith 完全依赖 AOP 实现模块校验
C 两者是同一技术的不同叫法
D Spring Modulith 只能与 AOP 一起使用
#

23. Spring AOP 在 Spring 6.x 中对 Protobuf/Java 17 record 的支持

A record 类隐式 final,CGLIB 无法继承代理,Spring 6.x 对其支持主要在数据绑定 ✓ 正确答案
B record 类可被 CGLIB 正常代理,因为 CGLIB 不依赖继承
C Protobuf 类可被 Spring AOP 完整代理
D record 类因为不可变所以更适用于 AOP
#

24. Spring AOP 的自调用(self-invocation)

A 自调用经过代理对象,AOP 通知正常运行
B 自调用通过 this 直接调用目标对象,绕过代理,AOP 通知失效 ✓ 正确答案
C 自调用只影响日志,不影响事务
D final 方法自调用不受影响
#

25. Spring Boot 3.5+ 启动流程中 SpringApplication.run() 的 ApplicationContext 实例化与生命周期

A ApplicationReadyEvent 在容器 refresh 之前发布
B 环境准备在容器启动完成之后进行
C ApplicationContext 的创建发生在 refresh 之后
D 内嵌 Web 服务器在 refresh 阶段启动,ApplicationReadyEvent 在容器刷新完成后发布 ✓ 正确答案
#

26. TestConfiguration 与测试 Bean 覆盖

A @TestConfiguration 会在组件扫描中被自动发现
B @TestConfiguration 不能定义在测试类内部
C @TestConfiguration 与 @Configuration 完全相同
D @TestConfiguration 只在测试中显式引用时生效,可补充或覆盖测试 Bean ✓ 正确答案
#

27. TransactionInterceptor 与 AOP 的协作

A TransactionInterceptor 是前置通知,在方法执行前开启事务后不再干预
B TransactionInterceptor 作为环绕通知,在方法执行前后控制提交/回滚,底层依赖 TransactionManager ✓ 正确答案
C TransactionInterceptor 与 AOP 无关,是独立的事务实现
D TransactionInterceptor 只负责回滚,不负责提交
#

28. Spring AOP 性能开销的真实基准

A AOP 只影响启动性能,不影响运行性能
B AOP 代理会导致业务性能下降 50% 以上
C JDK 动态代理开销恒低于 CGLIB
D AOP 代理开销在真实业务中占比极小,通常可忽略,应聚焦通知内部逻辑 ✓ 正确答案
#

29. 循环依赖的检测与 @Lazy 解决方案

A @Lazy 注入延迟代理,推迟依赖生成,可规避构造器注入循环 ✓ 正确答案
B 三级缓存能解决所有循环依赖,包括构造器注入循环
C @Lazy 与普通注入完全相同,无任何作用
D 循环依赖无需处理,Spring 自动全部解决
#

30. 构造器注入、Setter 注入与字段注入(@Autowired)在不可变性、可测试性、循环依赖与容器耦合上的差异,为什么 Spring 官方推荐优先构造器注入,@Resource 与 @Autowired 的解析规则又有何不同

A 构造器注入保证不可变、必填、便于测试,Spring 官方推荐优先使用 ✓ 正确答案
B 字段注入最利于不可变性与测试
C @Autowired 按名称解析,@Resource 按类型解析
D Setter 注入能保证依赖不可变
#

31. 自动向量化对循环依赖、数据对齐和边界检查有何要求,如何确认生成了 SIMD 指令

A 循环携带依赖不会影响向量化
B SIMD 指令生成无法被观察
C 边界检查不消除也能向量化
D 自动向量化要求循环无迭代间依赖、数据可对齐、边界检查可消除,可通过 PrintAssembly 查看 SIMD 指令确认 ✓ 正确答案
#

32. AOP 与 GraalVM Native Image 的兼容性挑战

A AOP 的动态代理与反射在 Native 下需显式配置或依赖 Spring AOT 提前生成元数据 ✓ 正确答案
B Native Image 完全支持 CGLIB 运行时字节码增强
C Native Image 下 AOP 无需任何配置即可工作
D 动态代理与 Native Image 无任何冲突