在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);
}
}
如果幫助到您,幫忙點一下廣告支持,感恩。
- Spring Boot properties file value injection 屬性配置檔注入
- Spring Boot 動態修改properties的內容 change Environment properties
- Example: the Class name substitution PropertyPlaceholderConfigurer
- Resources as dependencies
- ClassPathResource
- Spring 3.1 Environment does not work with user property files
- Using multiple property files (via PropertyPlaceholderConfigurer) in multiple projects/modules
沒有留言:
張貼留言