尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

《Java 100 天进阶之路》第73篇:Spring IoC容器(2026版)

《Java 100 天进阶之路》第73篇:Spring IoC容器(2026版) 第73篇Spring IoC容器2026版系列导航《Java 100 天进阶之路》完整目录 |⬅️ 上一篇第72篇JavaWeb面试高频题 |➡️ 下一篇第74篇Bean生命周期待发布️ 本文阅读地图3 分钟速览第72篇完成了JavaWeb专题的收官本篇正式开启Spring全家桶专题。Spring是Java后端开发的事实标准而IoC容器是Spring最核心的基石——理解了IoC容器就理解了Spring的心脏模块核心问题一句话回答IoC是什么控制反转到底反转了什么对象的创建权从自己new反转给容器管理DI是什么依赖注入和IoC什么关系DI是IoC的具体实现方式——容器把依赖注入给对象BeanFactory vs ApplicationContext两个容器有什么区别BeanFactory是基础款懒加载ApplicationContext是旗舰款预加载企业级功能Bean是什么Spring里的Bean到底是什么被Spring IoC容器管理的Java对象Bean生命周期Bean从生到死经历什么实例化→属性填充→初始化→使用→销毁三种配置方式怎么告诉Spring要管理哪些对象XML配置、注解配置、Java配置ConfigurationBean面试最爱问高频考点有哪些见文末 小节一、核心知识点1. IoC是什么IoCInversion of Control控制反转是一种设计原则用于减少代码间的直接依赖关系。其核心思想是将对象的创建、依赖管理等控制权从业务代码转移到外部容器。通俗理解传统编程中调用者主动创建和管理被调用者的生命周期——你需要什么自己new一个。IoC模式下你只需要声明我需要什么容器会帮你创建好并注入进来。2. DI是什么DIDependency Injection依赖注入是IoC的具体实现方式。对象只通过构造函数参数、工厂方法参数或属性来定义它们的依赖项容器在创建Bean时注入这些依赖。核心关系IoC是一种思想DI是实现这种思想的技术手段。3. IoC解决了什么问题问题传统方式IoC方式耦合度高类内部直接new依赖对象换实现要改代码依赖通过构造函数/Setter传入换实现不改代码难以测试依赖硬编码无法Mock依赖可替换单元测试容易难以扩展新增功能要改已有代码通过配置/注解扩展符合开闭原则4. IoC的三大优势优势说明解耦性对象间的依赖关系通过容器配置而非硬编码实现可测试性依赖注入使得单元测试可以通过Mock对象轻松完成可配置性Bean的创建和装配过程可以通过配置文件或注解灵活调整二、通俗讲解1分钟开心学把IoC容器想象成智能工厂 配送中心本系列第68篇讲过Servlet容器Tomcat是后厨。Spring IoC容器比它更进了一步——它不只是后厨而是整条供应链的智能管理中心。传统方式自己new你想做一道菜得自己种菜、自己养猪、自己磨调料——所有依赖都得自己搞定。IoC方式容器管理你只需要告诉工厂我要做宫保鸡丁工厂自动把鸡肉、花生、干辣椒配齐送到你手上——你只管炒菜。两个容器的比喻BeanFactory小区楼下的自动售货机——你要什么投币才出货懒加载功能单一。ApplicationContext大型仓储超市——一开门就把所有货品都摆好预加载还提供推车、导购、退换货等全套服务事件、国际化、AOP等。三、Spring IoC容器体系3.1 容器层级关系Spring的IoC容器以BeanFactory为顶层接口ApplicationContext是其子接口org.springframework.beans和org.springframework.context包是Spring Framework IoC容器的基础。3.2 BeanFactory vs ApplicationContext这是Spring面试100%会问的对比题。对比维度BeanFactoryApplicationContext官方定位最基础的IoC容器接口定义Bean管理的核心规范BeanFactory的子接口增加了企业级功能加载策略懒加载——调用getBean()时才创建实例预加载——启动时一次性创建所有单例Bean核心功能只提供getBean()等基础功能继承BeanFactory全部功能 10大扩展功能实际使用几乎见不到每天都用——SpringApplication.run(...)返回的就是它常用实现DefaultListableBeanFactoryAnnotationConfigApplicationContext、ClassPathXmlApplicationContextApplicationContext比BeanFactory多出的核心功能功能说明事件发布与监听ApplicationEventEventListener国际化i18nMessageSource支持多语言资源加载ResourceLoader支持classpath:、file:等环境抽象EnvironmentProfile支持多环境配置AOP自动代理自动识别Aspect并织入Transactional直接生效Web应用支持WebApplicationContext记忆口诀BeanFactory是基础款够用但简陋ApplicationContext是旗舰款功能全、体验好。实际项目100%用ApplicationContext。3.3 Bean是什么在Spring中构成应用程序骨架并由Spring IoC容器管理的对象称为Bean。Bean是由Spring IoC容器实例化、组装和管理的对象。本质Bean就是一个普通的Java对象唯一特殊之处在于——它由Spring容器管理而不是你自己new出来的。四、Bean生命周期5阶段Bean的生命周期是Spring面试的必考项需要掌握以下核心阶段初始化阶段详解这是生命周期中最复杂的阶段步骤说明① Aware接口回调BeanNameAware、BeanFactoryAware等② BeanPostProcessor前置处理初始化前的拦截③InitializingBean.afterPropertiesSet()接口方式初始化④ 自定义init-methodXML或注解指定的初始化方法⑤ BeanPostProcessor后置处理初始化后的拦截AOP代理在此完成五、三种Bean配置方式容器通过读取配置元数据来获取指令——告诉它要实例化哪些对象、如何装配它们。配置元数据可以用三种方式表达5.1 XML配置传统方式!-- applicationContext.xml --beansbeaniduserServiceclasscom.example.UserServiceImplpropertynameuserDaorefuserDao//beanbeaniduserDaoclasscom.example.UserDaoImpl//beans// 加载XML配置ApplicationContextctxnewClassPathXmlApplicationContext(applicationContext.xml);UserServiceservicectx.getBean(userService,UserService.class);5.2 注解配置主流方式Service// 声明为业务层BeanpublicclassUserServiceImplimplementsUserService{Autowired// 自动注入依赖privateUserDaouserDao;}Repository// 声明为数据访问层BeanpublicclassUserDaoImplimplementsUserDao{// 数据访问逻辑}// 启动容器Spring Boot自动完成ApplicationContextctxnewAnnotationConfigApplicationContext(com.example);注解含义Component是通用注解Service、Repository、Controller是其特化版本分别用于业务层、数据层和控制层。5.3 Java配置ConfigurationBeanConfiguration// 声明这是一个配置类publicclassAppConfig{Bean// 方法返回值会被注册为Spring容器中的BeanpublicUserServiceuserService(UserDaouserDao){returnnewUserServiceImpl(userDao);}BeanpublicUserDaouserDao(){returnnewUserDaoImpl();}}// 加载Java配置ApplicationContextctxnewAnnotationConfigApplicationContext(AppConfig.class);Configuration原理配置类会经过ConfigurationClassPostProcessor后置处理器处理解析所有Bean方法并转换为Bean定义。Configuration类本身也会被注册为容器中的一个Bean。六、避坑要点错误/误区后果正确做法混淆IoC和DI的概念面试答非所问IoC是思想DI是实现方式认为new出来的对象也是Bean容器无法管理依赖注入失效只有容器创建和管理的对象才是Bean误以为项目用的是BeanFactory对容器能力理解有偏差实际项目100%用ApplicationContext不知道Configuration和Component的区别配置类被代理行为异常Configuration是配置类Full模式Component是普通组件在Bean的构造函数中做耗时操作容器启动变慢耗时操作放到PostConstruct或afterPropertiesSet中七、面试高频考点Q1IoC和DI是什么关系IoC控制反转是一种设计思想——将对象的创建和依赖管理的控制权从代码转移到容器。DI依赖注入是IoC的具体实现方式——对象通过构造函数参数、工厂方法参数或属性来定义依赖容器在创建Bean时注入这些依赖。IoC是理念DI是做法。Q2BeanFactory和ApplicationContext的区别BeanFactory是Spring最基础的IoC容器接口采用懒加载策略只提供getBean()等基础功能。ApplicationContext是BeanFactory的子接口采用预加载策略——启动时一次性创建所有单例Bean还额外提供了事件发布、国际化、资源加载、AOP集成等企业级功能。实际项目100%用ApplicationContext。Q3Spring Bean的生命周期有哪些阶段五个阶段①实例化——容器通过反射调用构造函数创建实例②属性填充——通过依赖注入设置属性值③初始化——执行Aware回调、BeanPostProcessor前置处理、afterPropertiesSet、自定义init-method、BeanPostProcessor后置处理④使用——Bean被应用程序调用⑤销毁——容器关闭时按相反顺序触发销毁逻辑。Q4Configuration和Bean的作用是什么Configuration标记在类上声明这是一个配置类相当于XML配置文件。Bean标记在配置类的方法上指示该方法返回的对象应该被注册为Spring容器中的Bean。配置类会经过ConfigurationClassPostProcessor处理将Bean方法转换为Bean定义。Q5Spring支持哪几种Bean配置方式三种①XML配置——传统的bean标签方式②注解配置——通过Component、Service、Autowired等注解③Java配置——通过ConfigurationBean。现代Spring Boot项目以注解配置和Java配置为主。 面试官追问陷阱加分题追问1“Configuration标注的类和Component标注的类有什么区别”Configuration类会被Spring动态代理保证其中Bean方法调用时返回的是容器中已存在的Bean实例保证单例。而Component标注的普通类不会被代理。简单说Configuration是Full模式Bean之间调用走代理Component是Lite模式不走代理。追问2“ApplicationContext启动时做了什么事能简单说下流程吗” 核心是refresh()方法。主要步骤①创建并准备BeanFactory②读取配置元数据XML/注解/Java配置生成BeanDefinition③注册BeanPostProcessor④初始化所有非懒加载的单例Bean⑤发布上下文就绪事件。这就是为什么ApplicationContext启动比BeanFactory慢——它把活都提前干完了。八、练习题简答题请用自己的话解释IoC和DI的关系。代码题使用ConfigurationBean方式配置一个DataSourceBean和一个UserDaoBeanUserDao依赖DataSource。分析题某Spring Boot项目启动非常慢经排查发现启动时创建了大量Bean。请分析可能的原因并给出优化建议。 你的学习进度当前第73篇 / 共108篇 ·进阶篇Spring全家桶第73~82篇✅ 已完成基础篇44篇 第45~73篇 正在学第73篇⏳ 待学习第74~108篇 完整目录 学习指南 | 订阅本专栏不错过每一篇 下一篇文章预告下一篇《第74篇Bean生命周期》内容简介Bean生命周期完整15步详解、BeanPostProcessor原理、InitializingBean与PostConstruct执行顺序、销毁流程、扩展点实战。Spring全家桶专题持续推进深入Bean生命周期《Java 100 天进阶之路 | 从入门到上岗就业》每天一篇建议收藏 关注一起100天拿offer 点击关注我更新后第一时间收到推送
返回列表