システム プロパティを使用する必要はありません。ただし、ビルド中にプレースホルダーを解決する必要があります。
次のようにプロパティをオブジェクトに配置します。
<bean id="cacheProperties" class="java.util.Properties">
<constructor-arg>
<props>
<prop key="prop1">#{prop1}</prop>
<prop key="prop2">#{prop2}</prop>
</props>
</constructor-arg>
</bean>
そして、それらをカスタム PlaceHolderHelper に設定します。
<bean id="cachePlaceholderHelper"
class="com.PlaceholderHelper" depends-on="cacheProperties">
<property name="configFileResource" value="classpath:cacheConfig.xml"/>
<property name="properties" ref="cacheProperties"/>
</bean>
PlaceholderHelper は次のようになります。
private Resource configFileResource;
private Properties properties;
private Resource resolvedConfigResource;
@PostConstruct
public void replace() throws IOException {
PropertyPlaceholderHelper helper = new PropertyPlaceholderHelper("${", "}");
if (this.properties != null && this.configFileResource != null) {
File file = this.configFileResource.getFile();
String content = FileUtils.readFileToString(file);
String result = helper.replacePlaceholders(content, this.properties);
File resolvedCacheConfigFile = new File("resolvedCacheConfig");
FileUtils.write(resolvedCacheConfigFile, result);
resolvedConfigResource = new FileSystemResource(resolvedCacheConfigFile);
logger.info(String.format("Placeholders in file %s were replaced.", file.getName()));
}
}
p:configLocationを解決済みリソースに変更します。
p:configLocation="#{cachePlaceholderHelper.resolvedConfigResource}
XML のどこでも ${prop1} 式を使用できるようになりました。