Bean是Spring框架的一个关键概念。因此,理解这个概念对于掌握框架并有效使用它至关重要。不幸的是,**对于什么是Spring bean这个简单问题,并没有清晰的答案。**有些解释过于深入,以至于忽视了大局,而其他一些则过于含糊。 本教程将试图阐明这个主题,首先从官方文档中的描述开始。
以下是Spring框架文档中对beans的定义: 在Spring中,构成您的应用程序的骨干并由Spring IoC容器管理的对象称为beans。Bean是由Spring IoC容器实例化、组装和管理的对象。 这个定义简洁明了,**但未对一个重要元素:Spring IoC容器进行详述。**让我们更仔细地看看它是什么,以及它带来的好处。
简单地说,控制反转 (IoC) 是**一个对象定义其依赖性而不创建它们的过程。**此对象将构建此类依赖性的工作委托给一个IoC容器。 在深入研究IoC之前,让我们先看一个示例。
假设我们有一个类声明:
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
}
通常,我们使用类的构造函数创建对象:
Address address = new Address("High Street", 1000);
Company company = new Company(address);
这种方法没有什么问题,但如果能更好地管理依赖关系,那就更好了。 想象一个拥有几十甚至几百个类的应用程序。有时我们希望在整个应用程序中共享一个类的单一实例,有时我们需要为每个用例创建一个单独的对象,等等。管理这么多的对象简直是一场噩梦。这就是控制反转派上用场的地方。 对象可以从IoC容器中获取其依赖项,而不是自己构建依赖项。我们需要做的就是为容器提供适当的配置元数据。
首先,让我们用@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容器管理的。
由于我们在配置类中定义了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。
原文: