吊打面试官系列:深入理解Spring的IOC容器

Spring IOC详解及Bean生命周期详细过程,看完直接吊打面试官 面试题 来自面试官发自灵魂深处的拷问:谈谈你对spring的理解; 一脸懵逼的求职者的内心活动:啥? 具体的问题是什么?现在的面试都不按套路出牌了吗? 抛出一个这么大的问题,你让我怎么回答? 一脸懵逼的求职者的回答:额~ ~ ~ 这个。。。。 额~ ~ ~ 那个。。。。额~ ~ ~ 不知道唉。。。 为什么面试官要问这种问题? 不可否认,现在的大多数的面试出题方式都是这样的,惊人的相似,就是面试官喜欢抛出一个问题,看你能讲多深,考的就是你对这项技术的深度和广度,深度就是你对技术底层了解程度,广... 阅读详情

01 引言

Spring提供Java一站式服务的生态圈,其中最重要是控制反转(IOC)和面向切面编程(AOP)这两个特性,更是在面试八股文中屡次被问到。AOP已经在上一期文章中,通过自定义注解做了介绍。

本次,我们将一起了解经典的面试题:什么是IOC容器。

02 基本概念

IOC(inversion of control)就是控制反转的意思。控制反转依然让人一头雾水,到底什么反转了?

在我们没有用到Spring生态的时候,我们自己需要控制对象的创建和管理。例如当我们需要使用一个对象的时候,我们自己通过new 关键字创建,然后调用其内部的方法。

这不有句调侃程序员的话:程序员不怕没有对象,没事就是new一个,new的对象太多了,导致现实的反噬,没有女朋友。哈哈…

IOC时代的到来,代替了我们对对象的管理。所有对象的创建和管理交给了Spring容器统一管理,使用的时候通过注入的方式直接获取就好了。这种对对象控制权由开发者转移到Spring,发生了反转。这就是控制反转。

03 控制反转案例对比

我们通过代码,对比IOC前后的变化。

3.1 非IOC管理

public class UserService {
    public void test() {
        System.out.println("test 方法执行了...");
    }
}

// 方法调用
@Test
void contextLoads() {
    // 通过new关键字创建对象
    UserService userService = new UserService();
    userService.test();
}

对象哪里需要哪里new,我的对象我做主。

3.2 IOC容器管理

@Component
public class UserService {

    public void test() {
        System.out.println("test 方法执行了...");
    }
}

// 方法调用
@Autowired
UserService userService;

@Test
void contextLoads() {
    userService.test();
}

其中@Component注解将UserService对象的创建和管理交给了Spring,调用的时候,通过@Autowired注解将对象注入进来,然后正常调用即可。

除了@Component注解可以控制反转,还有@Bean注解。还有一些复合注解@Controller、@Service、@Repository、@RestController,里面都集成了@Component。但是使用的位置都不同。

3.3 对比

非IOC管理的对象,使用更加灵活,不受框架的限制,可以用在任何地方。而IOC管理就要依赖Spring框架。

非IOC管理的对象,使用的越多,创建的对象就越多,因此占用的资源也就会越多,如果循环创建对象,可能造成内存溢出。虽然可以通过单例的方式解决,但是需要为每一个对象,设置单例。这时候IOC容器的好处就来了。默认就是单例模式,容器只会创建一次对象。

对比非空参构造的对象,如果发生参数的修改,对于非IOC管理的对象来说似灾难,每一处用到的地方都要手动修改。而IOC管理的对象,只需要修改实例化的地方即可。

04 IOC实现原理

4.1 容器测试

@Test
    void test() {
        ApplicationContext context = new AnnotationConfigApplicationContext("com.simonking.boot.aop");
        UserService contextBean = context.getBean(UserService.class);
        contextBean.test();
    }

ApplicationContext就是我们所说的Spring容器,他的主要实现有两个:

  • AnnotationConfigApplicationContext:解析注解
  • XmlWebApplicationContext:解析Xml

案例中采用注解的方式,扫描com.simonking.boot.aop,所有相关的注解@Component、@Bean,并加载到容器中。

从容器中通过getBean()的方式获取容器中的Bean对象。然后进行业务操作。

4.2 源码脉络

我们以AnnotationConfigApplicationContext为例追踪。

上面的脉络图是执行的关键代码,简单总结一下总共有三步:

  • 通过AnnotationConfigApplicationContext的构造函数,读取扫描路径的所有.class文件。
  • 将.class通过ScannedGenericBeanDefinition读取BeanDefinition信息,并交给Spring容器。
  • Spring容器通过getBean的方式或者注入的方式,获取容器中的Bean对象。

4.3 源码追踪

AnnotationConfigApplicationContext构造函数:

public AnnotationConfigApplicationContext(String... basePackages) {
    this();
    // 扫描包路径
    scan(basePackages);
    // 启动Spring容器
    refresh();
}

scan的主要代码块如图:

其中①获取扫描包下的所有.class的BeanDefinition。

并通过ConfigurationClassUtils.isConfigurationCandidate方法筛选目标候选的BeanDefinition.

其中candidateIndicators包括:

再通过②③步骤获取BeanName并注册到org.springframework.beans.factory.support.BeanDefinitionRegistry中,从此完成scan操作。

refresh()是Spring的核心,也是Bean初始化流程,而Bean的所有信息,都保留在BeanDefinitionRegistry里面。

05 小结

IOC的思想很简单,但是里面的处理逻辑非常复杂,以兼容各种情况,这就是框架的魅力。里面的refresh()涉及的知识点太多,无法详细说明。如果想了解其详细流程,可以在公众号输入关键字【Spring源码】,获取PDF流程图。下面是一张鸟瞰图:

【系列05】端侧AI:构建与部署高效的本地化AI模型 第4章:模型量化(Quantization) 量化的基本思想是减少模型中用于表示参数和激活值的比特数。在模型训练时,参数通常使用32位浮点数(FP32)进行存储,这提供了高精度,但也消耗大量的内存和计算资源。量化则将这些32位浮点数转换成低比特数表示,通常是8位整数(INT8)。量化的原理可以概括为:对浮点数范围进行校准,并将其映射到更小的整数范围内。例如,将一个FP32的权重(如-1.5到1.5)映射到INT8的范围(-128到127)。在推理过程中,模型将使用这些低精度的整数进行计算,从而大大减少了所需的计算量。量化带来的主要收益减少模型大小。 阅读详情

相关推荐

轴承寿命预测实战:手把手教你用IEEE PHM2012数据集训练模型(附Python代码)

本文详细介绍了如何利用IEEE PHM2012数据集构建轴承剩余寿命预测模型,从数据预处理、特征工程到LSTM模型训练与部署,提供了完整的Python代码实现。通过实战案例,帮助读者掌握预测性维护中的关键技术,提升工业设备的运行安全与效率。

weixin_29186249的博客 311

啃完这689道Spring知识笔记 我竟吊打字节面试官

,关于源码这个问题,确实很多人感到苦恼,实际上只要肯花心思,活学活用,也没有什么知识是掌握不了的。进阶架构师,是很多Java程序员的目标,但这个目标的实现是漫长的,是辛苦的,是需要耗费大量时间和精力的,要通过不断的学习,提升自己,才能够让自己快速成长。关于Spring实战系列,一定要着重标记,因为面试对于实战要求也是有一定水准的,尤其是大厂,非常考察实战经验和思考。由于Spring相关的面试训练题的题量比较多,一共有69道题,文章篇幅有限,所以只展示了25道题,需要完整版以及详细的答案解析,

2501_90433155的博客 558

CorelDRAW 2019安装指南:从下载到激活的完整步骤

本文提供了一份详细的CorelDRAW 2019安装指南,涵盖从下载安装包、检查系统环境到完成激活的完整步骤。文章重点解析了安装过程中的关键选项设置,并分享了首次启动后的优化配置与常见问题解决方案,旨在帮助用户高效、顺利地完成这款经典矢量设计软件的安装与配置。

weixin_29213827的博客 834

如何吊打面试者-面试官初体验

开场白 作为久经沙场的我(也就3年工作经验),也是经历了几十场的面试,可以作为面试官,我还是头一次,接下来分享一下这场面试的经历。 背景 由于业务需求量大增,开发人手不足,招聘任务也就落到我们几个高级开发身上。 接到HR发给我的简历,一看六年工作经验,作为三年开发经验的我,当时心里还是蛮紧张的,心想别被吊打了(敖丙的吊打面试官系列看多了), 仔细看了一下简历,简历技能内容如下: 熟悉java,设计模式,有良好的编程习惯。 熟悉jvm内存管理机制,熟悉并发编程。 熟悉tomcat,redis,RabbitM

沪漂一族的博客 631

基于ROS的室内移动机器人自主导航技术

随着机器人技术的发展,近些年来室内移动机器人的研究热度越来越高。本文主要利用ROS操作系统对室内移动机器人的建图定位与自主导航关键技术进行研究。 ROS是目前开发较为完整具有广阔应用前景的开源机器人操作系统,具有分布式、模块化、代码复用等优良特点。同时ROS还提供了许多开源库,在这些库的基础之上研究同时定位与地图构建和机器人自主导航技术可以节省大量时间。 ORB-SLAM2是比较优秀的视觉SLAM算法之一,它具有计算量比较小、能够实时运行等优点。在介绍ORB-SLAM2的框架之前,首先会介绍视觉SLAM的一

weixin_44553616的博客 1910

ESD防护设计宝典(十一):CE(传导发射)超标问题排查与解决

(Conducted Emission, CE),亦称为传导骚扰,是电子电气设备或系统内部的电压、电流通过信号线、电源线或地线向外传输,对其他电子电气设备或系统造成电磁干扰的物理现象。其。

m0_56451176的博客 856

【吊打面试官】2021春招高频面试题之spring,看完搞定99%的大厂spring面试题!

Spring面试题(一) 1、一般问题 1.1、不同版本的SpringFramework有哪些主要功能? 1.2、什么是SpringFramework? 1.3、列举SpringFramework的优点。 1.4、SpringFramework有哪些不同的功能? 1.5、SpringFramework中有多少个模块,它们分别是什么? 1.6、什么是Spring配置文件? 1.7、Spring应用程序有哪些不同组件? 1.8、使用Spring有哪些方式? 依赖注入(Ioc) 2.1、什么是SpringIOC容

weixin_53170315的博客 3646

R语言生存分析之限制性立方样条分析:样条回归、和多项式回归有什么不同?是否存在非线性关系、限制性立方样条cox回归模型

R语言生存分析之限制性立方样条分析:样条回归、和多项式回归有什么不同?是否存在非线性关系、限制性立方样条cox回归模型

statistics+insight+vista+power 634

4月Java面试,吃透这些Spring面试解析+笔记+视频,随便吊打面试官

**面试常问的内容大致上有:**IOC、AOP、AOP原理动态代理和cglib原理与二者之间的区别、Bean 生命周期、ThreadLocal 保证线程安全、事务传播、Spring MVC、设计模式,除了这些面试题经常出现的,还有就是需要看一些Spring源码解读,因为一些面试官会问你,有没有看过源码,这时候把自己看过的看懂的说一下就OK了。下面分享一些我在复习Spring的面试复习资料和学习笔记! 注意注意:以上分享的这些Spring笔记:面试锦集解析+学习笔记+学习导图+Spring源码视频,有需要的

didi558的博客 830

LVGL iPhone Duo 开合过渡

环境:LVGL 9.x(需要软件模糊),窗口建议 1280×800。界面文案英文(默认 Montserrat 无 CJK)。

摸鱼专家 149

【用unity实现100个游戏之18】从零开始制作一个类CSGO/CS2、CF第一人称FPS射击游戏——基础篇1(附项目源码)

生存和射击游戏一直是我的最爱,说起3D最普遍的应该就是射击系统了,你可以在任何情况下加入射击功能,所以我写下了这篇FPS开发记录。希望对你有帮助。在这个项目中,你将学习如何设计和实现射击系统、武器系统、玩家控制、场景设计等方面的内容。通过这个项目,你将深入了解游戏开发中的许多核心概念和技术,并且在实践中不断提升自己。本项目将带你从零开始逐步实现一个完整的第一人称射击游戏,并且会逐步引入一些高级功能,如特效、声音等。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 5500

「阿里Java面试解析」Spring灵魂拷问100题解析,让你吊打面试官

给大家送一个小福利附高清脑图,高清知识点讲解教程,以及一些面试真题及答案解析。送给需要的提升技术、准备面试跳槽、自身职业规划迷茫的朋友们。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!885)]附高清脑图,高清知识点讲解教程,以及一些面试真题及答案解析。送给需要的提升技术、准备面试跳槽、自身职业规划迷茫的朋友们。[外链图片转存中…(img-HYx3NcpI-1713519065886)]

2401_83703866的博客 1034

194、产线 Camera 校准与测试:终检测试项、规格线制定与量产数据监控

摘要: 文章通过"绿屏门"案例揭示了产线Camera校准测试中的关键问题,提出了系统性改进方案。在终检测试方面,建议增加多增益暗电流测试、混合光源色温测试和径向亮度梯度测试,覆盖用户真实场景。规格线制定强调用CPK替代固定百分比,区分硬软规格并建立动态调整机制。量产监控需关注参数趋势、边界模组分布,构建失效模式数据库。实践建议包括测试冗余设计、规格余量预留、自动化监控、供应商数据共享和人工抽检保留。文章指出Camera产线质量管控需形成"测试设计-规格优化-数据监控"闭环,以数据驱动决策避免客诉风险。

sundong_81的博客 192

面试腾讯被“吊打”,一问Spring三不知,半年后二战终拿下offer

春节过后,时光飞逝,到现在更是眨眼间国庆节都过了,2021年已经过了一大半的时光了,不知道各位读者朋友们在飞逝的时光中有没有找到一份自己如意的工作,或是还在接着上一份工作在原地踏步。我有幸在上个月通过腾讯的面试,并顺利拿下了Offer 。 不过可不是一次通过,是面试了两次,没错 就是两次,第一次投的是阿里云,面试当中前两面倒是没出问题,可到了第三面 面试官扯出了spring 我尽然支支吾吾半天还没说出他所问的一半,直接被吊打。结果大家可想而知了。第二是面试的是腾讯,让我没想到的是面试官小胖子居然也问到了sp

yyyy_11119的博客 170

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

啃完这些 Spring 知识点,我竟吊打了阿里面试官(附面经 + 笔记)

关于大厂面试,总的来说,技术相关的考察主要分为两大块,一是基础,二是经验,基础包括 java 基础、数据库、中间件等,来自于日常的积累和面试前的准备。经验包括以往做过的项目、解决的问题、以及一些场景题(比如你的项目如果流量大了十倍如何保证可用)。既然有进入大厂工作的理想,就要为此付诸行动——学习,刻不容缓。【这里想说,因为自己也走了很多弯路过来的,所以才下定决心整理,收集过程虽不易,但想到能帮助到一部分自学或者是想提升java技术、成为Java架构师,提升技术P5-P6-P7-P8 的人,心里也是甜的!

m0_60721514的博客 1190

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

这份spring源码笔记真的强,把源码讲解的如此透特

关于为什么我们需要学习源码,你可以这么问自己,你啥都会,啥都不精,有啥用,真的落地干活的时候,就会发现,啥也做不好,你能做的别人都会做,还不能独立完整的完成某一项工作,那你有什么个人竞争力呢?

m0_46995061的博客 263

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

32天腾讯突击:JVM+Redis+Spring全家桶 已成功涨薪16K

银四马上就要结果~2021年可以说是过了将近一半的时光了,不知道各位读者朋友们在飞逝的时光中有没有找到一份自己如意的工作,或是还在接着上一份工作在原地踏步。我有幸在上个月通过腾讯的面试,并顺利拿下了Offer。 不过可不是一次通过,是面试了两次,没错 就是两次,第一次投的是阿里云,面试当中前两面倒是没出问题,可到了第三面 面试官扯出了spring我尽然支支吾吾半天还没说出他所问的一半,直接被吊打。结果大家可想而知了。第二是面试的是腾讯,让我没想到的是面试官小胖子居然也问到了spring,还好通过上一次..

Java6888的博客 228

【项目推荐】基于 SpringBoot3 + Spring AI 的游泳馆管理系统:Agent + RAG + Function Calling 一次学全

它不是玩具 Demo,而是一个「业务 + AI」双主线交织的真实系统——预约业务在跑,AI 客服在旁边实时查库作答,两条线通过 Function Calling、RAG、站内消息串成一体。面试官问「你做过什么 AI 项目」时,你能从业务场景讲到架构取舍,从 RAG 切分参数讲到降级兜底——这和「我调了一下 ChatGPT 的 API」是完全不同的两个段位。项目已包含完整的建表 SQL、初始化数据、部署文档,克隆下来就能跑。获取方式:见文末说明 / 后台回复关键词获取。—— 完 ——

深耕开发,专注编程实战。分享源码解析、项目搭建、问题排查笔记,沉淀技术,持续更新。 347

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 289

MCP 2026-07-28 无状态协议大改版:Spring AI 2.1 多轮往返请求与网关路由落地

无状态,所以任何实例都能处理任何请求,扩容不再需要粘性会话;显式句柄,所以跨调用状态是可审计、可过期的,而不是藏在进程内存里;幂等重放,所以交互式中断在分布式环境下也可恢复,代价是你要自己保证副作用可对账;头部路由,所以网关能在不解析 body 的前提下做治理,而校验 header/body 一致性成了新的安全底线。这些没有一个是在发明新概念。它们是分布式系统里被验证过二十年的老手艺:无状态、显式上下文、幂等、网关治理、fail-fast、可观测。

qq_36021478的博客 151

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 346
上一篇: 揭秘自定义注解,背后的面向切面编程(AOP)的艺术
下一篇: 吊打面试官系列:Spring为什么不推荐使用字段注入?
智_永无止境
博客等级 码龄10年 803粉丝 404原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智_永无止境

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值