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
这是项目结构。
<?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-core
、spring-context
、spring-jdbc
,以及日志 logback-classic
依赖项。
exec-maven-plugin
用于从 Maven 命令行执行 Spring 应用程序。
<?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 日志库的配置文件。
db.url=jdbc:h2:mem:testdb db.username=testuser db.password=s$cret
这些属性将被插入到具有 Bean 后置处理器工厂的 Bean 中。
<?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。${}
语法从外部属性文件中插入值。
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
。它使用 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 教程。