Guide to the Spring BeanFactory – Spring BeanFactory指南

最后修改: 2016年 11月 20日


1. Introduction


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


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.


3. Maven Dependencies


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。


4. The BeanFactory Interface


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.


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.


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.


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.


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


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:


  • 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:


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

7. Configuring the BeanFactory with XML


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"/>
<alias name="employee" alias="empalias"/>

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


8. BeanFactory with ClassPathResource


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


public class BeanFactoryWithClassPathResourceTest {

    public void createBeanFactoryAndCheckEmployeeBean() {
        Resource res = new ClassPathResource("beanfactory-example.xml");
        BeanFactory factory = new XmlBeanFactory(res);
        Employee emp = (Employee) factory.getBean("employee");

        assertTrue(factory.getBean("employee") instanceof Employee);
        assertTrue(factory.isTypeMatch("employee", Employee.class));
        assertTrue(factory.getAliases("employee").length > 0);

9. Conclusion


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.