Spring 加载 properties 的两种形式
在我的项目中如果有些参数常常须要批改,或者前期可能须要批改,那咱们最好把这些参数放到 properties 文件中,源代码中读取 properties 外面的配置,这样前期只须要改变 properties 文件即可,不须要批改源代码,这样更加不便。在 spring 中也能够这么做,而且 Spring 有两种加载 properties 文件的形式:基于 xml 形式和基于注解形式。上面别离探讨下这两种形式。
1、通过 xml 形式加载 properties 文件
咱们以 Spring 实例化 dataSource 为例,咱们个别会在 beans.xml 文件中进行如下配置:
<!-- com.mchange.v2.c3p0.ComboPooledDataSource 类在 c3p0-0.9.5.1.jar 包的 com.mchange.v2.c3p0 包中 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/shop" />
<property name="user" value="root" />
<property name="password" value="root" />
</bean>
当初如果咱们要扭转 dataSource,咱们就得批改这些源代码,然而咱们如果应用 properties 文件的话,只须要批改那外面的即可,就不论源代码的货色了。那么如何做呢?
Spring 中有个
dataSource=com.mchange.v2.c3p0.ComboPooledDataSource
driverClass=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/shop
user=root
password=root
当初只须要在 beans.xml 中做如下批改即可:
<context:property-placeholder location="classpath:conn.properties"/><!-- 加载配置文件 -->
<!-- com.mchange.v2.c3p0.ComboPooledDataSource 类在 c3p0-0.9.5.1.jar 包的 com.mchange.v2.c3p0 包中 -->
<bean id="dataSource" class="${dataSource}"> <!-- 这些配置 Spring 在启动时会去 conn.properties 中找 -->
<property name="driverClass" value="${driverClass}" />
<property name="jdbcUrl" value="${jdbcUrl}" />
<property name="user" value="${user}" />
<property name="password" value="${password}" />
</bean>
<!-- 与下面的配置等价,上面的更容易了解 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations"> <!-- PropertyPlaceholderConfigurer 类中有个 locations 属性,接管的是一个数组,即咱们能够在上面配好多个 properties 文件 -->
<array>
<value>classpath:conn.properties</value>
</array>
</property>
</bean>
尽管看起来没有下面的简洁,然而更加清晰,倡议应用前面的这种。然而这个只限于 xml 的形式,即在 beans.xml 中用 ${key} 获取配置文件中的值 value。
2、通过注解形式加载 properties 文件
还有一种就是通过注解的形式,在 Java 代码中应用 @Value 注解来加载配置文件中的值。
咱们来看一个例子:如果咱们要在程序中获取某个文件的绝对路径,咱们很天然会想到不能在程序中写死,那么咱们也能够卸载 properties 文件中。还是在 src 目录下新建一个 public.properties 文件,假如外面写了一条记录:
filePath=E:webapache-tomcat-8.0.26webappsE_shopimage
- 如果想在 java 代码中通过注解来获取这个 filePath 的话,首先得在 beans.xml 文件中配置一下注解的形式:
<!-- 第二种形式是应用注解的形式注入,次要用在 java 代码中应用注解注入 properties 文件中相应的 value 值 -->
<bean id="prop" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations"><!-- 这里是 PropertiesFactoryBean 类,它也有个 locations 属性,也是接管一个数组,跟下面一样
<array>
<value>classpath:public.properties</value>
</array>
</property>
</bean>
当初咱们能够在 java 代码中应用注解来获取 filePath 的值了:
@Component("fileUpload")
public class FileUploadUtil implements FileUpload {
private String filePath;
@Value("#{prop.filePath}")
//@Value 示意去 beans.xml 文件中找 id="prop" 的 bean,它是通过注解的形式读取 properties 配置文件的,而后去相应的配置文件中读取 key=filePath 的对应的 value 值
public void setFilePath(String filePath) {System.out.println(filePath);
this.filePath = filePath;
}
留神要有 set 办法能力被注入进来,注解写在 set 办法上即可。在 setFilePath 办法中通过控制台打印 filePath 是为了在启动 tomcat 的时候,察看控制台有没有输入来,如果有,阐明 Spring 在启动时,曾经将 filePath 给加载好了,咱们看一下控制台的启动信息:
以上就是 Spring 加载 properties 配置文件的两种形式。实际上,下面基于 xml 形式中的 PropertyPlaceholderConfigurer 类和这里基于注解形式的 PropertiesFactoryBean 类都是继承 PropertiesLoaderSupport,都是用来加载 properties 配置文件的。