原文: http://zetcode.com/spring/beanfactory/

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

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

Spring BeanFactory

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

Spring BeanFactory示例

该应用创建一个 bean 工厂,从 XML 配置文件加载 bean 定义,并在 bean 上应用后处理器。

  1. pom.xml
  2. src
  3. ├───main
  4. ├───java
  5. └───com
  6. └───zetcode
  7. Application.java
  8. └───resources
  9. database.properties
  10. logback.xml
  11. my-beans.xml
  12. └───test
  13. └───java

这是项目结构。

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  5. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  6. <modelVersion>4.0.0</modelVersion>
  7. <groupId>com.zetcode</groupId>
  8. <artifactId>beanfactory</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10. <properties>
  11. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  12. <maven.compiler.source>11</maven.compiler.source>
  13. <maven.compiler.target>11</maven.compiler.target>
  14. <spring-version>5.1.3.RELEASE</spring-version>
  15. </properties>
  16. <dependencies>
  17. <dependency>
  18. <groupId>ch.qos.logback</groupId>
  19. <artifactId>logback-classic</artifactId>
  20. <version>1.2.3</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.springframework</groupId>
  24. <artifactId>spring-context</artifactId>
  25. <version>${spring-version}</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.springframework</groupId>
  29. <artifactId>spring-core</artifactId>
  30. <version>${spring-version}</version>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework</groupId>
  34. <artifactId>spring-jdbc</artifactId>
  35. <version>${spring-version}</version>
  36. </dependency>
  37. </dependencies>
  38. <build>
  39. <plugins>
  40. <plugin>
  41. <groupId>org.codehaus.mojo</groupId>
  42. <artifactId>exec-maven-plugin</artifactId>
  43. <version>1.6.0</version>
  44. <configuration>
  45. <mainClass>com.zetcode.Application</mainClass>
  46. </configuration>
  47. </plugin>
  48. </plugins>
  49. </build>
  50. </project>

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

exec-maven-plugin用于在命令行上从 Maven 执行 Spring 应用。

resources/logback.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration>
  3. <logger name="org.springframework" level="ERROR"/>
  4. <logger name="com.zetcode" level="INFO"/>
  5. <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
  6. <encoder>
  7. <Pattern>%d{HH:mm:ss.SSS} %blue(%-5level) %magenta(%logger{36}) - %msg %n
  8. </Pattern>
  9. </encoder>
  10. </appender>
  11. <root>
  12. <level value="INFO" />
  13. <appender-ref ref="consoleAppender" />
  14. </root>
  15. </configuration>

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

resources/database.properties

  1. db.url=jdbc:h2:mem:testdb
  2. db.username=testuser
  3. db.password=s$cret

这些属性将通过 bean 后处理工厂插入到 bean 中。

resources/my-beans.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd">
  6. <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
  7. <property name="url" value="${db.url}"></property>
  8. <property name="username" value="${db.username}"></property>
  9. <property name="password" value="${db.password}"></property>
  10. </bean>
  11. </beans>

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

com/zetcode/Application.java

  1. package com.zetcode;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
  5. import org.springframework.beans.factory.support.DefaultListableBeanFactory;
  6. import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
  7. import org.springframework.core.io.ClassPathResource;
  8. import org.springframework.jdbc.datasource.SimpleDriverDataSource;
  9. public class Application {
  10. private static final Logger logger = LoggerFactory.getLogger(Application.class);
  11. public static void main(String[] args) {
  12. var factory = new DefaultListableBeanFactory();
  13. var reader = new XmlBeanDefinitionReader(factory);
  14. reader.loadBeanDefinitions(new ClassPathResource("my-beans.xml"));
  15. var cfg = new PropertyPlaceholderConfigurer();
  16. cfg.setLocation(new ClassPathResource("database.properties"));
  17. cfg.postProcessBeanFactory(factory);
  18. var dataSource = (SimpleDriverDataSource) factory.getBean("dataSource");
  19. logger.info("Url: {}", dataSource.getUrl());
  20. logger.info("User name: {}", dataSource.getUsername());
  21. logger.info("Password: {}", dataSource.getPassword());
  22. }
  23. }

该应用创建一个BeanFactory并注册一个 bean。

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

创建了DefaultListableBeanFactory,它是BeanFactory的实现。 它使用XmlBeanDefinitionReadermy-beans.xml配置文件读取 bean。 Bean 定义已加载loadBeanDefinitions()

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

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

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

我们使用getBean()从工厂获得了 Bean。

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

我们检索dataSource bean 属性。

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

我们运行该应用。

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

您可能也对这些相关教程感兴趣: Spring BeanDefinitionBuilder教程Spring 单例范围 beanSpring 注入列表 XML 教程Spring BeanDefinitionBuilder教程Spring HikariCP 教程Java 教程