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不支持基于注解的依赖注入,而ApplicationContextBeanFactory的超集)则支持更多功能。

要了解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上查看


« 上一篇: JUnit 5指南
» 下一篇: Java SHA-256哈希