# 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 无任何冲突