Spring BeanFactory

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

Spring 是用于创建企业应用的流行 Java 应用框架。

Spring BeanFactory

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

Spring BeanFactory示例

该应用创建一个 bean 工厂,从 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>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <spring-version>5.1.3.RELEASE</spring-version>

    </properties>

    <dependencies>

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</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>1.6.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"));

创建了DefaultListableBeanFactory,它是BeanFactory的实现。 它使用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 定义。

赞(0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址