乐趣区

关于java:在上海乐字节学习的第二十七天持续更新中

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 配置文件的。

退出移动版