Spring 依赖注入:自动注入properties文件中的配置

http://outofmemory.cn/code-snippet/3700/spring-bean-property-inject

在很多情况下我们需要在配置文件中配置一些属性,然后注入到bean中,Spring提供了org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer类,可以方便我们使用注解直接注入properties文件中的配置。

下面我们看下具体如何操作:

首先要新建maven项目,并在pom文件中添加spring依赖,如下pom.xml文件:

<projectxmlns="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>cn.outofmemory</groupId><artifactId>hellospring.properties.annotation</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>hellospring.properties.annotation</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><org.springframework-version>3.0.0.RC2</org.springframework-version></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><!-- Spring --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${org.springframework-version}</version></dependency></dependencies></project>

要自动注入properties文件中的配置,需要在spring配置文件中添加org.springframework.beans.factory.config.PropertiesFactoryBeanorg.springframework.beans.factory.config.PreferencesPlaceholderConfigurer的实例配置:

如下spring配置文件appContext.xml

<?xml version="1.0" encoding="UTF-8"?><beansxmlns="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-3.0.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context-3.0.xsd "><!-- bean annotation driven --><context:annotation-config/><context:component-scanbase-package="cn.outofmemory.hellospring.properties.annotation"></context:component-scan><beanid="configProperties"class="org.springframework.beans.factory.config.PropertiesFactoryBean"><propertyname="locations"><list><value>classpath*:application.properties</value></list></property></bean><beanid="propertyConfigurer"class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer"><propertyname="properties"ref="configProperties"/></bean></beans>

在这个配置文件中我们配置了注解扫描,和configProperties实例和propertyConfigurer实例。这样我们就可以在java类中自动注入配置了,我们看下java类中如何做:

package cn.outofmemory.hellospring.properties.annotation;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;@ComponentpublicclassMySQLConnectionInfo{@Value("#{configProperties['mysql.url']}")privateString url;@Value("#{configProperties['mysql.userName']}")privateString userName;@Value("#{configProperties['mysql.password']}")privateString password;/**
     * @return the url
     */publicString getUrl(){return url;}/**
     * @return the userName
     */publicString getUserName(){return userName;}/**
     * @return the password
     */publicString getPassword(){return password;}}

自动注入需要使用@Value注解,这个注解的格式#{configProperties['mysql.url']}其中configProperties是我们在appContext.xml中配置的beanId,mysql.url是在properties文件中的配置项。

properties文件的内容如下:

mysql.url=mysql's url
mysql.userName=mysqlUser
mysql.password=mysqlPassword

最后我们需要测试一下以上写法是否有问题,如下App.java文件内容:

package cn.outofmemory.hellospring.properties.annotation;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;/**
 * Hello world!
 *
 */publicclassApp{publicstaticvoid main(String[] args ){ApplicationContext appContext =newClassPathXmlApplicationContext("appContext.xml");MySQLConnectionInfo connInfo = appContext.getBean(MySQLConnectionInfo.class);System.out.println(connInfo.getUrl());System.out.println(connInfo.getUserName());System.out.println(connInfo.getPassword());}}

在main方法中首先声明了appContext,然后获得了自动注入的MySQLConnectionInfo的实例,然后打印出来,运行程序会输出配置文件中配置的值。

猜你喜欢

转载自hunan.iteye.com/blog/2360346