spring通过ioc容器实现依赖自动注入,核心是将对象创建和依赖管理交由容器处理;启动时扫描@component等注解类注册为bean,默认单例;通过类型优先、名称匹配完成@autowired装配;支持构造器、setter、字段等多种注入方式;底层基于反射与生命周期管理。

Spring 通过 IoC(Inversion of Control,控制反转)容器实现依赖自动注入,核心在于把对象的创建和依赖关系管理从代码中剥离,交给 Spring 容器统一处理。你不用 new 对象、也不用手动 set 依赖,只要声明“需要什么”,Spring 就在运行时自动给你准备好并装配好。
容器启动时扫描并注册 Bean
Spring 启动时会根据配置(如 @ComponentScan)扫描指定包路径下的类,识别带有 @Component 及其派生注解(@Service、@Repository、@Controller)的类,将它们作为 Bean 注册到 IoC 容器中。每个 Bean 有唯一标识(默认是类名首字母小写),容器内部维护一张 Bean 名称 → 实例(或 BeanDefinition)的映射表。
- Bean 默认是单例(Singleton)作用域,整个应用生命周期内只创建一次
- 若类有无参构造方法或满足 @Autowired 构造器条件,Spring 会尝试实例化它
- 未加注解的普通类不会被自动注册,也不会被注入
基于类型或名称匹配完成自动装配
当一个 Bean 中声明了依赖(比如字段上有 @Autowired),Spring 会在容器中按类型(byType)查找匹配的 Bean。如果找到唯一一个,就直接注入;如果找到多个,再按字段名(byName)进一步筛选;若仍不唯一,可配合 @Qualifier 指定 Bean 名称。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
-
@Autowired可用于构造器、setter 方法、普通字段(推荐构造器注入,保证不可变性和测试友好) - 字段注入虽简洁,但不利于单元测试(无法手动传入 mock 对象)
- 若依赖为 null,常见原因是:目标类没加组件注解、包没被扫描到、或类型/名称完全不匹配
支持多种注入方式与灵活配置
除了自动装配,Spring 还允许显式控制依赖来源。例如用 @Resource(JSR-250)按名称注入,或用 @Value 注入配置属性;也可通过 @Primary 标记首选 Bean,或用 @Profile 实现环境隔离。
- 构造器注入:Spring 优先使用匹配的构造器创建实例,并填入所需依赖
- Setter 注入:调用 setter 方法完成赋值,适合可选依赖或后期修改场景
- 集合注入:List、Map 等泛型字段也能自动注入所有匹配类型的 Bean
底层本质是反射 + 生命周期管理
IoC 容器不是魔法——它用反射调用构造器或 setter 创建对象,再借助 Java 的字段/方法访问权限机制完成赋值。同时管理 Bean 的完整生命周期:实例化 → 属性填充 → 初始化(@PostConstruct 或 InitializingBean)→ 使用 → 销毁(@PreDestroy)。
- BeanFactory 是基础接口,ApplicationContext 是其高级实现,提供事件、AOP、国际化等扩展能力
- 依赖注入发生在 Bean 初始化阶段,早于任何业务方法调用
- 循环依赖能被解决(仅限 setter/字段注入,构造器注入会报错)
不复杂但容易忽略细节:确保类被正确扫描、注解拼写准确、依赖类型存在且唯一,注入就水到渠成。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










