網頁

2017/11/17

Spring 注入properties檔的參數設定

在Spring從properties檔注入參數的範例如下。


例如連接資料庫的datasource設定如url,使用者名稱及密碼等通常不會直接設定在Spring的配置檔,而是會另外設定在properties檔,如此部屬在不同環境時,只要抽換properties檔就可以連接不同的資料庫了。

datasource的設定檔為dataSource.properties,位在應用程式根目錄(也就是src/dataSource.properties),內容如下。

dataSource.properties

#DB JDBC
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@10.1.1.231:1521:mydb
jdbc.username=matthung
jdbc.password=12345
#FILE
file.path=D:\\files\\

在Spring的配置檔applicationContext.xml設定如下

applicationContext.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.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

  <!-- Spring 3.1之後的版本 -->
  <!-- 讀取properties檔 -->
  <context:property-placeholder location="classpath:dataSource.properties" order="1" ignore-unresolvable="true" file-encoding="UTF-8" /> 
  
  <!-- Spring 3.1之前的版本 -->
  <!--
  <bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="fileEncoding" value="UTF-8" />
    <property name="location" value="classpath:dataSource.properties" />
    <property name="ignoreUnresolvablePlaceholders" value="true" />
  </bean>
  -->
  
  <!-- 設定datasource -->
  <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
    <property name="url" value="${jdbc.url}" /> <!-- 使用Spring property placeholder  ${...} 來注入properties檔的參數 -->
    <property name="username" value="${jdbc.username}" /> 
    <property name="password" value="${jdbc.password}" />  
  </bean>

</beans>

在程式中要讀取Properites檔可使用@Value注入至成員變數。

@Service
public class FileServiceImpl {
  
    @Value("${file.path}")
    private String filePath; // inject "D:\\files\\" from properties file
  
    public File readFile(String fileName){
        return read(filePath + fileName);
    }
}

若以Environment變數取得Properties則設定如下,使用@PropertySource

AppConfig.java

@Configuration
@PropertySource(value={ "classpath:dataSource.properties" }, ignoreResourceNotFound=true)
public class AppConfig {

    @Autowired
    protected Environment env;
  
    public String getProperty(String key) {
        return env.getProperty(key);
    }

}

注意使用<context:property-placeholder >的配置不會將Properties注入Environment,而僅能使用@Value(${...})注入成員變數或在配置檔使用${...}的方式來讀取Properties。


如果有多個properties檔則設定如下。

  <!-- Spring 3.1之後的版本 -->
  <!-- 讀取properties檔 -->
  <context:property-placeholder 
    location="classpath:dataSource.properties, 
              classpath:error.properties" 
    order="1" 
    ignore-unresolvable="true" 
    file-encoding="UTF-8" /> 

在程式中讀取Properites的類別設定

AppConfig.java

@Configuration
@PropertySource(
    value={ "classpath:dataSource.properties","classpath:error.properties" },
    ignoreResourceNotFound=true
)
public class AppConfig {

    @Autowired
    protected Environment env;
  
    public String getProperty(String key) {
        return env.getProperty(key);
    }

}

如果幫助到您,幫忙點一下廣告支持,感恩。


沒有留言:

張貼留言