1. 概述
本篇文章将深入探讨Spring BeanFactory API 的使用。
BeanFactory
接口提供了一个简单但灵活的机制,通过Spring的依赖注入容器来管理各类对象。在深入了解这个核心Spring API之前,我们先了解一下基础概念。
2. 基础 - 对象与容器
简而言之,bean是Spring应用的核心Java对象,由Spring IoC容器进行管理和创建。除了由容器管理外,bean并没有什么特殊之处(在其他方面,它只是应用程序中众多对象之一)。
Spring容器负责bean的实例化、配置和组装。容器通过读取我们为应用程序定义的配置元数据,得知需要创建、配置和管理哪些对象。
3. Maven依赖
让我们在pom.xml
文件中添加所需的Maven 依赖项。我们将使用Spring Beans依赖来设置BeanFactory:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
4. BeanFactory
接口
首先,让我们看看org.springframework.beans.factory
包中的接口定义,以及讨论其中一些重要方法。
4.1. getBean()
方法
getBean()
方法的多个版本会返回指定bean的实例,这些实例在整个应用中可能是共享的,也可能是独立的。
4.2. containsBean()
方法
此方法确认是否在这个bean工厂中包含具有给定名称的bean。具体来说,它确认getBean(String)
是否能够获取到具有给定名称的bean实例。
4.3. isSingleton()
方法
isSingleton
方法可以用来查询这个bean是否是共享单例。也就是说,getBean(String)
始终会返回相同的实例。
4.4. isPrototype()
方法
此方法确认getBean(String)
是否会返回独立的实例,即一个配置为原型作用域的bean,或者不是。
需要注意的是,这个方法返回false
并不明确表示单例对象。它表示非独立的实例,可能对应于其他作用域。
要明确检查共享单例实例,我们需要使用isSingleton(String)
操作。
4.5. 其他方法
isTypeMatch(String name, Class targetType)
方法用于检查具有给定名称的bean是否匹配指定类型,而getType(String name)
则有助于识别具有给定名称的bean的类型。
最后,getAliases(String name)
如果有的话,会返回给定bean名称的别名。
5. BeanFactory
API
BeanFactory
持有bean定义,并在客户端应用请求时实例化它们,这意味着:
- 它负责bean的生命周期管理,包括实例化和调用适当的销毁方法。
- 在实例化时,它能够创建依赖对象之间的关联。
- 重要的是,
BeanFactory
不支持基于注解的依赖注入,而ApplicationContext
(BeanFactory
的超集)则支持更多功能。
要了解ApplicationContext
能做什么,请阅读相关文档。
6. 定义bean
现在我们定义一个简单的bean:
public class Employee {
private String name;
private int age;
// standard constructors, getters and setters
}
7. 通过XML配置BeanFactory
我们可以使用XML来配置BeanFactory
。让我们创建一个名为bean-factory-example.xml
的文件:
<bean id="employee" class="com.baeldung.beanfactory.Employee">
<constructor-arg name="name" value="Hello! My name is Java"/>
<constructor-arg name="age" value="18"/>
</bean>
<alias name="employee" alias="empalias"/>
注意,我们还为employee
bean创建了别名。
8. 通过ClassPathResource
使用BeanFactory
ClassPathResource
属于org.springframework.core.io
包。让我们快速运行一个测试,如下面所示,使用ClassPathResource
初始化XmlBeanFactory
:
public class BeanFactoryWithClassPathResourceTest {
@Test
public void createBeanFactoryAndCheckEmployeeBean() {
Resource res = new ClassPathResource("beanfactory-example.xml");
BeanFactory factory = new XmlBeanFactory(res);
Employee emp = (Employee) factory.getBean("employee");
assertTrue(factory.isSingleton("employee"));
assertTrue(factory.getBean("employee") instanceof Employee);
assertTrue(factory.isTypeMatch("employee", Employee.class));
assertTrue(factory.getAliases("employee").length > 0);
}
}
9. 总结
在这篇简短的文章中,我们学习了Spring BeanFactory
API提供的主要方法,并通过一个示例展示了配置和使用方法。
这些示例的代码可以在GitHub上查看。