Bean 定义
在Spring中,构成应用程序主干并由Spring IoC容器管理的对象称为bean。bean是由Spring IoC容器实例化、组装和以其他方式管理的对象。
这个定义非常简明扼要,但是忽略了一个重要的东西——Spring IoC容器。让我们深入了解一下它是什么以及它带来的好处。
IoC容器
简单地说,控制反转,或简称IoC,是一个对象定义其依赖关系而不创建依赖关系的过程。此对象将构造此类依赖项的工作委托给IoC容器。
在深入IoC之前,让我们先声明几个域类。
Domain Classes
假设我们有一个类声明:
public class Company {
private Address address;
public Company(Address address) {
this.address = address;
}
// getter, setter and other properties
}
这个类需要一个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
}
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类的包中查找bean。
当Spring IoC容器构造这些类型的对象时,所有对象都被称为Spring bean,因为它们是由IoC容器管理的。
因为我们在配置类中定义了bean,所以我们需要一个AnnotationConfigApplicationContext类的实例来构建一个容器:
ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
快速测试验证bean的是否存在和属性值:
Company company = context.getBean("company", Company.class);
assertEquals("High Street", company.getAddress().getStreet());
assertEquals(1000, company.getAddress().getNumber());
结果证明IoC容器已经正确地创建和初始化了bean。