什么是Spring Bean

1. 概述

Bean是Spring框架的一个关键概念。因此,理解这个概念对于掌握框架并有效使用它至关重要。不幸的是,**对于什么是Spring bean这个简单问题,并没有清晰的答案。**有些解释过于深入,以至于忽视了大局,而其他一些则过于含糊。 本教程将试图阐明这个主题,首先从官方文档中的描述开始。

2. Bean定义

以下是Spring框架文档中对beans的定义: 在Spring中,构成您的应用程序的骨干并由Spring IoC容器管理的对象称为beans。Bean是由Spring IoC容器实例化、组装和管理的对象。 这个定义简洁明了,**但未对一个重要元素:Spring IoC容器进行详述。**让我们更仔细地看看它是什么,以及它带来的好处。

3. 控制反转

简单地说,控制反转 (IoC) 是**一个对象定义其依赖性而不创建它们的过程。**此对象将构建此类依赖性的工作委托给一个IoC容器。 在深入研究IoC之前,让我们先看一个示例。

3.1 示例类

假设我们有一个类声明:

public class Company {
    private Address address;

    public Company(Address address) {
        this.address = address;
    }

    // getter, setter和其他属性
}

此类需要一个类型为Address的变量:

public class Address {
    private String street;
    private int number;

    public Address(String street, int number) {
        this.street = street;
        this.number = number;
    }

    // getters和setters
}

3.2 传统方法

通常,我们使用类的构造函数创建对象:

Address address = new Address("High Street", 1000);
Company company = new Company(address);

这种方法没有什么问题,但如果能更好地管理依赖关系,那就更好了。 想象一个拥有几十甚至几百个类的应用程序。有时我们希望在整个应用程序中共享一个类的单一实例,有时我们需要为每个用例创建一个单独的对象,等等。管理这么多的对象简直是一场噩梦。这就是控制反转派上用场的地方。 对象可以从IoC容器中获取其依赖项,而不是自己构建依赖项。我们需要做的就是为容器提供适当的配置元数据。

3.3 Bean配置

首先,让我们用@Component注解来装饰Company类:

@Component
public class Company {
    // 此主体与之前的相同
}

这是一个配置类,向IoC容器提供bean元数据:

@Configuration
@ComponentScan(basePackageClasses = Company.class)
public class Config {
    @Bean
    public Address getAddress() {
        return new Address("High Street", 1000);
    }
}

配置类产生了一个类型为Address的bean。它还带有@ComponentScan注解,该注解指示容器在包含Company类的包中寻找beans。

当Spring IoC容器构造这些类型的对象时,所有的对象都被称为Spring beans,因为它们是由IoC容器管理的。

3.4 IoC实践

由于我们在配置类中定义了beans,我们需要AnnotationConfigApplicationContext类的一个实例来构建容器

ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);

快速测试验证我们的beans的存在和属性值:

Company company = context.getBean("company", Company.class);
assertEquals("High Street", company.getAddress().getStreet());
assertEquals(1000, company.getAddress().getNumber());

结果证明IoC容器已经正确地创建和初始化了beans。

原文:

https://www.baeldung.com/spring-bean