Guide to the Spring BeanFactory – Spring BeanFactory指南

最后修改: 2016年 11月 20日

中文/混合/英文(键盘快捷键:t)

1. Introduction

1.绪论

This article will focus on exploring the Spring BeanFactory API.

本文将重点介绍探索Spring BeanFactory API

BeanFactory interface provides a simple, yet flexible configuration mechanism to manage objects of any nature via the Spring IoC container. Let’s have a look at some basics before diving deep into this central Spring API.

BeanFactory接口提供了一个简单而又灵活的配置机制,以通过Spring IoC容器管理任何性质的对象。在深入研究这个中央Spring API之前,让我们先看看一些基础知识。

2. Basics – Beans and Containers

2.基础知识–Bean和容器

Simply put, beans are the java objects which form the backbone of a Spring application and are managed by Spring IoC container. Other than being managed by the container, there is nothing special about a bean (in all other respects it’s one of many objects in the application).

简单地说,Bean是构成Spring应用的骨干的java对象,由Spring IoC容器管理。除了被容器管理之外,Bean并没有什么特别之处(在其他方面,它是应用程序中众多对象中的一个)。

The Spring container is responsible for instantiating, configuring, and assembling the beans. The container gets its information on what objects to instantiate, configure, and manage by reading configuration metadata we define for the application.

Spring容器负责实例化、配置和组装Bean。容器通过读取我们为应用程序定义的配置元数据来获得关于要实例化、配置和管理哪些对象的信息。

3. Maven Dependencies

3.Maven的依赖性

Let’s add the required Maven dependency to the pom.xml file. We will be using Spring Beans dependency to set up the BeanFactory:

让我们把所需的Maven依赖添加到pom.xml文件中。我们将使用Spring Beans依赖项来设置BeanFactory。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>5.2.8.RELEASE</version>
</dependency>

4. The BeanFactory Interface

4.BeanFactory接口

It’s interesting to start by having a look at the interface definition in org.springframework.beans.factory package and discuss some of its important APIs here.

首先看看org.springframework.beans.factory包中的接口定义,并在此讨论其一些重要的API,这很有意思。

4.1. The getBean() APIs

4.1.getBean() API

Various versions of getBean() method return an instance of the specified bean, which may be shared or independent across the application.

各种版本的 getBean()方法返回指定Bean的实例,它可能是整个应用程序共享或独立的。

4.2. The containsBean() API

4.2.containsBean() API

This method confirms if this bean factory contains a bean with the given name. More specifically, it confirms if the getBean(java.lang.String) able to obtain a bean instance with the given name.

这个方法确认这个Bean工厂是否包含一个具有给定名称的Bean。更具体地说,它确认getBean(java.lang.String)是否能够获得一个具有给定名称的bean实例。

4.3. The isSingleton() API

4.3.isSingleton() API

The isSingleton API can be used to query if this bean is a shared singleton. That is if getBean(java.lang.String) will always return the same instance.

isSingleton API可以用来查询这个Bean是否是一个共享的单子。也就是说,如果getBean(java.lang.String)将始终返回同一个实例。

4.4. The isPrototype() API

4.4.isPrototype() API

This API will confirm if getBean(java.lang.String) returns independent instances – meaning a bean configured with the prototype scope, or not.

这个API将确认getBean(java.lang.String)是否返回独立的实例–意味着配置有原型范围的Bean,或者不是。

The important thing to note is this method returning false does not clearly indicate a singleton object. It indicates non-independent instances, which may correspond to other scopes as well.

需要注意的是,这个返回false的方法并不明确表示一个单子对象。它表示非独立的实例,这可能也对应于其他范围。

We need to use the isSingleton(java.lang.String) operation to explicitly check for a shared singleton instance.

我们需要使用 isSingleton(java.lang.String)操作来明确检查一个共享的单子实例。

4.5. Other APIs

4.5.其他API

While the isTypeMatch(String name, Class targetType) method checks whether the bean with the given name matches the specified type, getType(String name) is useful in identifying the type of the bean with the given name.

isTypeMatch(String name, Class targetType)方法检查具有给定名称的Bean是否匹配指定的类型,而getType(String name)在识别具有给定名称的Bean的类型时非常有用。

Finally, getAliases(String name) return the aliases for the given bean name, if any.

最后,getAliases(String name)返回给定bean名称的别名,如果有的话。

5. BeanFactory API

5.BeanFactory API

BeanFactory holds bean definitions and instantiates them whenever asked for by the client application – which means:

BeanFactory持有Bean定义,并在客户端应用程序要求时将其实例化–这意味着。

  • It takes care of the lifecycle of a bean by instantiating it and calling appropriate destruction methods
  • It is capable of creating associations between dependent object while instantiating them
  • It is important to point that BeanFactory does not support the Annotation-based dependency Injection whereas ApplicationContext, a superset of BeanFactory does

Do have a read on Application Context to find out what it can do extra.

请阅读应用上下文以了解它能做什么。

6. Defining the Bean

6.定义 “Bean “的含义

Let’s define a simple bean:

让我们来定义一个简单的Bean。

public class Employee {
    private String name;
    private int age;
    
    // standard constructors, getters and setters
}

7. Configuring the BeanFactory with XML

7.用XML配置BeanFactory

We can configure the BeanFactory with XML. Let’s create a file bean factory-example.xml:

我们可以用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"/>

Note that we’ve also created an alias for the employee bean.

注意,我们还为employeebean创建了一个别名。

8. BeanFactory with ClassPathResource

8.BeanFactoryClassPathResource

ClassPathResource belongs to the org.springframework.core.io package. Let’s run a quick test and initialize XmlBeanFactory using ClassPathResource as shown below:

ClassPathResource属于org.springframework.core.io包。让我们运行一个快速测试,使用XmlBeanFactory初始化ClassPathResource,如下所示。

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. Conclusion

9.结语

In this quick article, we learned about the main methods Spring BeanFactory API offers and an example to illustrate the configuration and its usage.

在这篇快速文章中,我们了解了Spring BeanFactory API提供的主要方法,并举例说明了配置及其用法。

The code backing these examples is all available over on GitHub.

支持这些例子的代码都可以在GitHub上找到