[英]How to change a value in XML programmatically
我有一个弹簧批处理应用程序。 用于存储 spring 批处理作业元数据的数据库配置如下:
在 application-context.xml 中:
<!-- stored job-meta in database - H2 -->
<bean id="jobRepository"
class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
<property name="dataSource" ref="dataSourceMetaData" />
<property name="transactionManager" ref="transactionManager" />
<property name="databaseType" value="h2" />
</bean>
在 database.xml 中:
<!-- configure H2 database connection -->
<bean id="dataSourceMetaData"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.h2.Driver" />
<property name="url" value="jdbc:h2:~/metaDataProd" />
</bean>
现在,应用程序可以在多个实例中在同一环境中运行,例如:一个实例用于生产,一个实例用于测试。 所以我必须使value="jdbc:h2:~/metaDataProd
配置,以便两个实例不会访问相同的数据库。
如果我从配置文件生成值,我可以轻松地做到这一点。 但我想知道是否有任何自动的方法来做到这一点。 例如:当一个应用程序实例被启动时,一个日期value="jdbc:h2:~/metaData2Jul
被附加到一个像这样value="jdbc:h2:~/metaData2Jul
value="jdbc:h2:~/metaData4Jul
编程盟友
您可以使用PropertySourcesPlaceholderConfigurer并从各种来源初始化值,如环境变量、外部属性文件等。 然后使用 ${propname} 占位符而不是硬编码值。
另见相关问题。
如果您不需要区分实例而只是希望它们不同,那么SpEL有一个非常简单的方法。 以下任何一项都可以完成这项工作:
<property name="url" value="#{ 'jdbc:h2:~/metaData' + T(java.lang.System).nanoTime() }" />
或者
<property name="url" value="#{ 'jdbc:h2:~/metaData-' + T(java.util.UUID).randomUUID() }" />
或者
<property name="url" value="#{ 'jdbc:h2:~/metaData-' + (new java.text.SimpleDateFormat('ddmm_hh_mm_ss')).format(new java.util.Date()) }" />
如果您对 spring.xml 或应用程序没有任何控制权,但可以在启动前执行一些脚本,则可以在脚本中生成名称并替换 xml 中的 jdbc url 值(取决于脚本语言,SO 上有无穷无尽的解决方案) .
您可以为此指定 JNDI 属性并在 init uisng initialContext() 方法中加载该属性,如下所示:
new InitialContext(environment).lookup(myServiceJndiName);
在这种情况下,您可以为不同的环境指定不同的 jndi 值 test env 或 production env。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.