前言
译文链接:http://websystique.com/spring/spring-propertysource-value-annotations-example/
本篇文章将展示如何通过@PropertySource
和 @Value注解
从配置文件中读取属性值。
同样,我们也会讨论Spring的Environment
接口,还会看到使用XML配置和使用注解的对比。
Spring的@PropertySource
注解主要是让Spring的Environment接口读取属性配置文件用的,这个注解是标识在@Configuration配置类上的。
Spring的@Value注解可以用在字段和方法上。通常用于从属性配置文件中读取属性值,也可以设置默认值。接下来就让我么看下完整的例子吧。
涉及的技术及开发工具
- Spring 4.0.6.RELEASE
- Maven 3
- JDK 1.6
- Eclipse JUNO Service Release 2
工程结构目录
步骤一:往pom.xml中添加依赖
<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.websystique.spring</groupId> <artifactId>Spring4PropertySourceExample</artifactId> <version>1.0.0</version> <packaging>jar</packaging> <name>Spring4PropertySourceExample</name> <properties> <springframework.version>4.0.6.RELEASE</springframework.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${springframework.version}</version> </dependency> </dependencies> <build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.2</version> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> </plugins> </pluginManagement> </build> </project>
步骤二:创建Spring配置类
Spring配置类是指用@Configuration
注解标注的类,这些类包含了用@Bean
标注的方法。这些被@Bean
标注的方法可以生产bean并交由spring容器管理。
package com.websystique.spring.configuration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; @Configuration @ComponentScan(basePackages = "com.websystique.spring") @PropertySource(value = { "classpath:application.properties" }) public class AppConfig { /* * PropertySourcesPlaceHolderConfigurer Bean only required for @Value("{}") annotations. * Remove this bean if you are not using @Value annotations for injecting properties. */ @Bean public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { return new PropertySourcesPlaceholderConfigurer(); } }
@PropertySource(value = { “classpath:application.properties” })注解可以让在application.properties文件中定义的属性对Spring Envirronment bean
可用,Environment接口提供了getter方法读取单独的属性值。
注意PropertySourcesPlaceholderConfigurer这个bean,这个bean主要用于解决@value中使用的${…}占位符。假如你不使用${…}占位符的话,可以不使用这个bean。
以上的配置使用XML替代的话,如下:
app-config.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" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <context:component-scan base-package="com.websystique.spring"/> <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> <property name="ignoreUnresolvablePlaceholders" value="true"/> <property name="locations"> <list> <value>classpath:application.properties</value> </list> </property> </bean> </beans>
步骤三:创建配置文件
jdbc.driverClassName = com.mysql.jdbc.Driver jdbc.url = jdbc:mysql://localhost:3306/websystique jdbc.username = myuser jdbc.password = mypassword hibernate.dialect = org.hibernate.dialect.MySQLDialect hibernate.show_sql = false hibernate.format_sql = false sourceLocation = /dev/input
我们将会在service类里使用上面提到的配置方式读取这个配置文件
步骤四:创建服务类
package com.websystique.spring.service; public interface FileService { void readValues(); }
package com.websystique.spring.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.env.Environment; import org.springframework.stereotype.Service; @Service("fileService") public class FileServiceImpl implements FileService { @Value("${sourceLocation:c:/temp/input}") private String source; @Value("${destinationLocation:c:/temp/output}") private String destination; @Autowired private Environment environment; public void readValues() { System.out.println("Getting property via Spring Environment :" + environment.getProperty("jdbc.driverClassName")); System.out.println("Source Location : " + source); System.out.println("Destination Location : " + destination); } }
这里首先要注意的是Environment bean被Spring自动注入。另外,由于配置了@PropertySoruce注解,Environment bean可以访问指定配置文件里定义的所有属性值。你可以使用getProperty方法得到指定值。
另外一点值得注意的是@Value
注解,基本格式如下:
@value("${key:default") private String var;
以上声明指导spring根据key去属性配置文件查找value,如果没找到,则使用default作为默认值。
注意以上的${…}占位符只有当注册了PropertySourcesPlaceholderConfigurer bean
后才能被解析,否则@Value注解会一直将默认值赋值给var。
步骤五:创建Main方法运行程序
package com.websystique.spring; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.AbstractApplicationContext; import com.websystique.spring.configuration.AppConfig; import com.websystique.spring.service.FileService; public class AppMain { public static void main(String args[]){ AbstractApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); FileService service = (FileService) context.getBean("fileService"); service.readValues(); context.close(); } }
运行以上程序,得到如下结果:
Getting property via Spring Environment :com.mysql.jdbc.Driver
Source Location : /dev/input
Destination Location : c:/temp/output
AbstractApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
AbstractApplicationContext context = new ClassPathXmlApplicationContext("app-config.xml");
工程源码
http://websystique.com/?smd_process_download=1&download_id=796