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-core
,spring-context
,spring-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
的实现。 它使用XmlBeanDefinitionReader
从my-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 定义。
您可能也对这些相关教程感兴趣: Spring BeanDefinitionBuilder
教程, Spring 单例范围 bean , Spring 注入列表 XML 教程, Spring BeanDefinitionBuilder
教程 , Spring HikariCP 教程和 Java 教程。