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

Spring context:property-placeholder教程展示了如何使用context:property-placeholder标记来外部化 Spring 应用中的属性。

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

Spring 的context:property-placeholder

context:property-placeholder标签用于外部化单独文件中的属性。 它会自动配置PropertyPlaceholderConfigurer,从而替换${}占位符,这些占位符针对指定的属性文件(作为 Spring 资源位置)进行解析。

Spring context:property-placeholder示例

该应用使用context:property-placeholder来配置数据源的属性。

  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>propertyplaceholder</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

这些值在database.properties文件中外部化。 这种方法比将值直接放入 XML 文件中更为灵活。

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. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://www.springframework.org/schema/context
  8. http://www.springframework.org/schema/context/spring-context.xsd">
  9. <context:property-placeholder location="classpath:database.properties"/>
  10. <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
  11. <property name="url" value="${db.url}"></property>
  12. <property name="username" value="${db.username}"></property>
  13. <property name="password" value="${db.password}"></property>
  14. </bean>
  15. </beans>

context:property-placeholder指定属性文件的位置; 在我们的例子中,它是任何类路径目录中的database.properties文件。

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

定义了dataSource bean。 它通过${}语法从属性文件中获取其值。

com/zetcode/Application.java

  1. package com.zetcode;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import org.springframework.context.support.GenericXmlApplicationContext;
  5. import org.springframework.jdbc.datasource.SimpleDriverDataSource;
  6. public class Application {
  7. private static final Logger logger = LoggerFactory.getLogger(Application.class);
  8. public static void main(String[] args) {
  9. var ctx = new GenericXmlApplicationContext("my-beans.xml");
  10. var dataSource = (SimpleDriverDataSource) ctx.getBean("dataSource");
  11. logger.info("Url: {}", dataSource.getUrl());
  12. logger.info("User name: {}", dataSource.getUsername());
  13. logger.info("Password: {}", dataSource.getPassword());
  14. ctx.close();
  15. }
  16. }

这是主要的应用类。 它检索dataSource bean 并打印其属性。

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

我们运行该应用。

在本教程中,我们展示了如何使用context:property-placeholder来外部化属性。

您可能也对这些相关教程感兴趣: Spring @Qualifier注解教程Spring 单例范围 beanSpring C-命名空间教程Spring BeanDefinitionBuilder教程Spring bean 引用教程Java 教程