ZetCode

Spring BeanFactory 教程

最后修改于 2023 年 10 月 18 日

Spring BeanFactory 教程展示了如何在 Spring 应用程序中使用 BeanFactory 来处理 Bean

Spring 是一个流行的 Java 应用程序框架,用于创建企业级应用程序。

Spring BeanFactory

BeanFactory 是应用程序组件的中央注册表。它集中了应用程序组件的配置。BeanFactory 加载存储在配置源中的 Bean 定义,例如 XML 文档或 Java 配置。

Spring BeanFactory 示例

应用程序创建一个 BeanFactory,从 XML 配置文件加载 Bean 定义,并对 Bean 应用后置处理器。

pom.xml
src
├───main
│   ├───java
│   │   └───com
│   │       └───zetcode
│   │               Application.java
│   └───resources
│           database.properties
│           logback.xml
│           my-beans.xml
└───test
    └───java

这是项目结构。

pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
            http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zetcode</groupId>
    <artifactId>beanfactory</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <spring-version>5.3.23</spring-version>

    </properties>

    <dependencies>

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.4.0</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring-version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring-version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring-version}</version>
        </dependency>        
        
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>
                    <mainClass>com.zetcode.Application</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

pom.xml 文件中,我们有基本的 Spring 依赖项 spring-corespring-contextspring-jdbc,以及日志 logback-classic 依赖项。

exec-maven-plugin 用于从 Maven 命令行执行 Spring 应用程序。

resources/logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <logger name="org.springframework" level="ERROR"/>
    <logger name="com.zetcode" level="INFO"/>

    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <Pattern>%d{HH:mm:ss.SSS} %blue(%-5level) %magenta(%logger{36}) - %msg %n
            </Pattern>
        </encoder>
    </appender>

    <root>
        <level value="INFO" />
        <appender-ref ref="consoleAppender" />
    </root>
</configuration>

logback.xml 是 Logback 日志库的配置文件。

resources/database.properties
db.url=jdbc:h2:mem:testdb
db.username=testuser
db.password=s$cret

这些属性将被插入到具有 Bean 后置处理器工厂的 Bean 中。

resources/my-beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
        <property name="url" value="${db.url}"></property>
        <property name="username" value="${db.username}"></property>
        <property name="password" value="${db.password}"></property>
    </bean>

</beans>

my-beans.xml 文件声明了一个 dataSource Bean。${} 语法从外部属性文件中插入值。

com/zetcode/Application.java
package com.zetcode;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.datasource.SimpleDriverDataSource;

public class Application {

    private static final Logger logger = LoggerFactory.getLogger(Application.class);

    public static void main(String[] args) {

        var factory = new DefaultListableBeanFactory();
        var reader = new XmlBeanDefinitionReader(factory);
        reader.loadBeanDefinitions(new ClassPathResource("my-beans.xml"));

        var cfg = new PropertyPlaceholderConfigurer();
        cfg.setLocation(new ClassPathResource("database.properties"));
        cfg.postProcessBeanFactory(factory);

        var dataSource = (SimpleDriverDataSource) factory.getBean("dataSource");

        logger.info("Url: {}", dataSource.getUrl());
        logger.info("User name: {}", dataSource.getUsername());
        logger.info("Password: {}", dataSource.getPassword());
    }
}

应用程序创建一个 BeanFactory 并注册一个 Bean。

var factory = new DefaultListableBeanFactory();
var reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(new ClassPathResource("my-beans.xml"));

创建了一个 BeanFactory 的实现 DefaultListableBeanFactory。它使用 XmlBeanDefinitionReadermy-beans.xml 配置文件读取 Bean。Bean 定义通过 loadBeanDefinitions 加载。

var cfg = new PropertyPlaceholderConfigurer();
cfg.setLocation(new ClassPathResource("database.properties"));
cfg.postProcessBeanFactory(factory);

PropertyPlaceholderConfigurer 将属性从 database.properties 文件插入到 Bean 中。

var dataSource = (SimpleDriverDataSource) factory.getBean("dataSource");

我们使用 getBean 从工厂获取 Bean。

logger.info("Url: {}", dataSource.getUrl());
logger.info("User name: {}", dataSource.getUsername());
logger.info("Password: {}", dataSource.getPassword());

我们检索 dataSource Bean 的属性。

$ mvn -q exec:java
10:02:30.701 INFO  com.zetcode.Application - Url: jdbc:h2:mem:testdb
10:02:30.701 INFO  com.zetcode.Application - User name: testuser
10:02:30.701 INFO  com.zetcode.Application - Password: s$cret

我们运行应用程序。

在本文中,我们展示了如何创建 BeanFactory,以及如何加载和后处理 Bean 定义。

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直撰写编程文章。至今,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 Spring 教程