1. 概述
Spring Bean 是 Spring 框架中的一个核心概念。要真正掌握 Spring 并高效使用它,理解 Bean 的本质是绕不开的一环。
但奇怪的是,关于“Spring Bean 到底是什么”的问题,并没有一个特别明确统一的答案。有些解释太底层,让人抓不住主线;有些又太模糊,看完还是云里雾里。
本文将从官方文档入手,带你一步步厘清这个概念。
2. Bean 的定义
在 Spring 官方文档 中,是这样定义 Bean 的:
在 Spring 中,构成应用程序主干并由 Spring IoC 容器管理的对象称为 Bean。Bean 是由 Spring IoC 容器实例化、组装并管理的对象。
这段话简洁明了,但也忽略了一个关键点:Spring IoC 容器。我们接下来就重点聊聊它。
3. 控制反转(Inversion of Control)
简单来说,控制反转(IoC)是指一个对象不自己创建依赖,而是由外部容器来负责依赖的创建和注入。
听起来有点绕?别急,我们先来看两个实体类。
3.1. 实体类定义
public class Company {
private Address address;
public Company(Address address) {
this.address = address;
}
// getter, setter 等
}
Company 类依赖 Address:
public class Address {
private String street;
private int number;
public Address(String street, int number) {
this.street = street;
this.number = number;
}
// getters and setters
}
3.2. 传统方式创建对象
一般我们这样写:
Address address = new Address("High Street", 1000);
Company company = new Company(address);
✅ 这么写当然没问题,但如果项目里有成百上千个类呢?
有时候我们需要单例,有时候需要多例,有时候还要管理生命周期……这时候,手动管理对象简直就是一场灾难。
这时候 IoC 就派上用场了。
通过 IoC 容器,对象不再自己创建依赖,而是从容器中获取。我们只需要提供配置元数据即可。
3.3. Bean 的配置方式
我们先给 Company 类加上注解:
@Component
public class Company {
// 内容同上
}
然后写一个配置类:
@Configuration
@ComponentScan(basePackageClasses = Company.class)
public class Config {
@Bean
public Address getAddress() {
return new Address("High Street", 1000);
}
}
这个配置类做了两件事:
- 通过
@Bean
注解提供一个 Address 类型的 Bean - 通过
@ComponentScan
告诉容器去扫描 Company 所在包下的组件
✅ 当 Spring IoC 容器根据这些配置创建并管理对象时,这些对象就被称为 Spring Bean。
3.4. IoC 容器的实际使用
我们使用 AnnotationConfigApplicationContext
来加载配置类并启动容器:
ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
然后简单验证一下:
Company company = context.getBean("company", Company.class);
assertEquals("High Street", company.getAddress().getStreet());
assertEquals(1000, company.getAddress().getNumber());
✅ 结果证明,IoC 容器确实帮我们创建并注入了依赖。
4. 总结
这篇文章简单介绍了 Spring Bean 的定义及其与 IoC 容器的关系。Bean 并不是什么神秘的东西,本质上就是被 Spring 容器管理的对象。
完整代码可以在这里查看:GitHub 项目地址
📌 小结一下重点:
- ✅ Spring Bean 是由 Spring IoC 容器创建和管理的对象
- ✅ 使用
@Component
、@Bean
等注解可以声明 Bean - ✅ 配置类 +
@Configuration
是常见的 Bean 配置方式 - ⚠️ IoC 是 Spring 的核心机制,别和传统 new 对象的方式搞混了
希望这篇文章能帮你彻底搞懂 Spring Bean 的本质,别再被“控制反转”这些术语绕晕了 😄