news 2026/6/23 10:40:05

Spring IOC/DI 核心知识

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring IOC/DI 核心知识

一、核心容器架构

1. 容器层级关系

  • BeanFactory:根容器,提供基础的IoC功能,采用延迟加载策略
  • ApplicationContext:子容器,继承BeanFactory,增加AOP、消息源、事件发布等企业级功能
  • WebApplicationContext:专为Web应用设计的上下文,支持Request/Session作用域

2. 容器实现类

类型加载来源使用场景
ClassPathXmlApplicationContext类路径下的XML文件传统XML配置项目
AnnotationConfigApplicationContextJava配置类注解驱动项目
FileSystemXmlApplicationContext文件系统绝对路径特殊文件位置需求

二、IOC与DI核心概念

IOC(Inversion of Control - 控制反转)

本质:将对象的创建、存储、管理权限从程序员转移给Spring容器

  • 控制:创建对象的能力
  • 反转:将创建权交给Spring,我们只需获取使用

DI(Dependency Injection - 依赖注入)

本质:在容器创建对象后,自动为其属性赋值(注入依赖)

  • 作用:解耦对象间的依赖关系
  • 方式:XML配置、注解、自动注入

个人理解口诀:IOC创建对象,DI给属性赋值


三、XML配置详解

1. Bean定义基础

<beanid="userService"class="com.luo.service.impl.UserServiceImpl"scope="singleton"lazy-init="false"autowire="byType"><!-- 属性注入 --><propertyname="userDao"ref="userDao"/><propertyname="name"value="小罗"/></bean><beanid="userDao"class="com.luo.dao.impl.UserDaoImpl"/>

关键属性

  • id:Bean唯一标识(默认首字母小写类名)
  • class:类全路径
  • scope:作用域(singleton/prototype)
  • lazy-init:懒加载(默认false,启动时创建)
  • autowire:自动注入模式

2. 依赖注入三种方式

  1. Setter注入:通过<property>标签调用setter方法
  2. 构造器注入:通过<constructor-arg>标签
  3. 自动注入autowire="byType|byName|constructor"

四、Bean生命周期(重点背诵)

完整流程图

1. 解析配置 → BeanDefinition(元数据) 2. 实例化 → 构造函数创建对象 3. 属性注入 → DI(依赖注入) 4. 初始化 → 三种方式 ├─ @PostConstruct ├─ InitializingBean.afterPropertiesSet() └─ init-method指定 5. 使用 → getBean()返回实例 6. 销毁 → 三种方式 ├─ @PreDestroy ├─ DisposableBean.destroy() └─ destroy-method指定

单例 vs 多例

特性单例(singleton)多例(prototype)
创建时机容器启动时创建(默认)getBean()时创建
存储位置singletonObjects缓存集合不缓存,每次都新建
内存占用占用空间换时间效率每次创建新实例
线程安全需注意共享资源天然线程安全

懒加载lazy-init="true"使单例Bean在第一次获取时才创建


五、BeanDefinition vs singletonObjects

对象类型存储内容创建时机存储位置
BeanDefinitionBean元数据(类名、作用域、属性、依赖等)容器启动解析配置时BeanFactory元数据区
singletonObjects已实例化、注入、初始化的Bean对象单例Bean实例化后单例缓存池

关系:BeanDefinition是模板,singletonObjects是最终产品


六、扩展接口(高阶背诵)

1. BeanFactoryPostProcessor(Bean工厂后处理器)

执行时机:所有Bean实例化之前,只执行一次
作用:修改Bean定义、动态注册Bean、解析占位符
典型应用PropertySourcesPlaceholderConfigurer解析${}

2. BeanPostProcessor(Bean后处理器)

执行时机:Bean实例化后、初始化前后各执行一次
作用:AOP代理创建、依赖增强、性能监控
Spring AOP本质:通过BeanPostProcessor在初始化后创建代理对象

执行顺序

实例化 → 属性注入 → postProcessBeforeInitialization → 初始化 → postProcessAfterInitialization → 就绪可用

七、FactoryBean机制(复杂对象创建)

使用场景

  • 对象没有无参构造函数
  • 创建代理对象
  • 第三方框架整合
  • 动态创建复杂对象

实现步骤

  1. 创建类实现FactoryBean<T>接口
  2. 重写三个方法:
    • getObject():返回实际对象(会加入容器)
    • getObjectType():返回对象类型
    • isSingleton():是否单例(默认true)
  3. 配置Bean:<bean id="user" class="UserFactoryBean"/>

注意:容器中Bean的ID是getObject()返回的对象标识,而非FactoryBean本身


八、外部属性文件引入

<!-- 1. 引入properties文件 --><context:property-placeholderlocation="classpath:jdbc.properties"/><!-- 2. 使用占位符 --><beanid="dataSource"class="com.alibaba.druid.pool.DruidDataSource"><propertyname="driverClassName"value="${jdbc.driver}"/><propertyname="url"value="${jdbc.url}"/><propertyname="username"value="${jdbc.username}"/><propertyname="password"value="${jdbc.password}"/></bean>

作用:实现配置与代码分离,方便环境切换


九、Bean获取方式对比

// 1. 通过ID获取(不推荐,强依赖字符串)Objectbean=ctx.getBean("userService");// 2. 通过ID+类型(特定场景)UserServiceservice=ctx.getBean("userService",UserService.class);// 3. 通过类型(推荐,类型安全)UserServiceservice=ctx.getBean(UserService.class);

注意:同一类型多个Bean时,必须使用ID+类型方式


十、自动注入(Autowire)

模式规则适用场景
byType按类型匹配(默认)容器中该类型Bean唯一
byName按属性名匹配ID同类型多个Bean时
constructor按构造器参数类型构造器注入时

注解等价物

  • @Autowired=autowire="byType"
  • @Resource(name="xxx")=autowire="byName"

十一、核心记忆口诀

容器篇

  • 根容器:BeanFactory
  • 子容器:ApplicationContext
  • 加载方式:ClassPathXml、AnnotationConfig

IOC/DI篇

  • IOC:控制反转,创建对象交给Spring
  • DI:依赖注入,属性赋值自动化
  • 配置:XML(property)、注解(@Value)

生命周期篇

  • 四阶段:实例化 → 注入 → 初始化 → 使用
  • 两后置:BeanPostProcessor前后拦截
  • 一工厂:BeanFactoryPostProcessor前置修改

作用域篇

  • 单例:启动创建,缓存共享(默认)
  • 多例:获取创建,每次新建
  • 懒加载:延迟单例创建时间

十二、面试高频问答

Q1: BeanFactory和ApplicationContext区别?
A: BeanFactory是基础容器,延迟加载;ApplicationContext是增强版,立即加载,支持更多企业级功能。

Q2: 单例Bean线程安全吗?
A: Spring不保证线程安全,需开发者自己保证。多例Bean天然线程安全。

Q3: @Autowired和@Resource区别?
A: @Autowired按类型注入(默认),@Resource按名称注入(默认)。

Q4: BeanPostProcessor作用?
A: 在Bean初始化前后执行,Spring AOP就是基于此实现的动态代理。

Q5: FactoryBean和BeanFactory区别?
A: BeanFactory是IoC容器工厂,FactoryBean是创建特殊Bean的工厂Bean。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 20:16:39

42、数据绑定中的错误处理与ASP.NET数据绑定实践

数据绑定中的错误处理与ASP.NET数据绑定实践 在数据应用开发中,数据输入验证和错误处理是至关重要的环节。下面将详细介绍自定义对象的错误信息提供、数据并发问题解决以及ASP.NET中的数据绑定相关内容。 自定义对象通过IDataErrorInfo提供错误信息 在使用自定义业务对象进…

作者头像 李华
网站建设 2026/6/14 0:09:23

46、WinFx数据绑定入门指南

WinFx数据绑定入门指南 1. WinFx数据绑定基础 在之前看到的一些简单的WinFx应用程序示例中,并没有涉及到数据相关的操作。实际上,WinFx拥有丰富的模型来设置数据绑定控件,其工作方式与Windows Forms有所不同,旨在更加灵活且减少代码量。 WinFx元素支持数据绑定上下文的概…

作者头像 李华
网站建设 2026/6/19 1:16:36

Kotaemon危机公关声明撰写:负面舆情应对

Kotaemon危机公关声明撰写&#xff1a;负面舆情应对 在社交媒体主导信息传播的今天&#xff0c;一条突发负面新闻可能在几小时内演变为一场全面的品牌危机。某知名消费电子企业曾因产品安全质疑在微博发酵&#xff0c;短短三小时内话题阅读量突破2亿&#xff0c;而其公关团队直…

作者头像 李华
网站建设 2026/6/22 15:10:15

Kotaemon如何生成参考文献?学术写作辅助新玩法

Kotaemon如何生成参考文献&#xff1f;学术写作辅助新玩法 在撰写论文的深夜&#xff0c;你是否曾为找不到合适的文献引用而焦头烂额&#xff1f;又是否因格式不统一、作者名拼写错误等细节问题被审稿人退回修改&#xff1f;这些看似琐碎却极为关键的问题&#xff0c;正悄然吞噬…

作者头像 李华
网站建设 2026/6/23 2:06:57

12、深入解析词法分析与语法分析工具的核心功能

深入解析词法分析与语法分析工具的核心功能 在编程和软件开发中,词法分析和语法分析是构建编译器、解释器等工具的重要基础。下面将详细介绍相关工具中的一些关键函数和特性。 词法分析相关函数 yymore() 和 yyless() 当处理带引号的字符串时,如果字符串以反斜杠结尾,在…

作者头像 李华
网站建设 2026/6/22 18:27:25

13、Bison 解析器的高级特性与使用技巧

Bison 解析器的高级特性与使用技巧 1. 错误恢复机制 当解析器遇到无法解析的输入标记时,会尝试按照以下步骤进行错误恢复: 1. 调用 yyerror("syntax error") ,通常用于向用户报告错误。 2. 丢弃所有部分解析的规则,直到回到可以移入特殊错误符号的状态。 …

作者头像 李华