我有一个 Spring 批量应用程序。用于存储 Spring Batch 作业元数据的数据库配置如下:
在 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:~/metaData4Jul
最佳答案
您可以使用PropertySourcesPlaceholderConfigurer并初始化来自各种来源的值,例如环境变量、外部属性文件等。然后使用 ${propname} 占位符而不是硬编码值。
另请参阅related question .
如果你不需要区分实例,只是想让它们不同,有一个非常简单的方法 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 值(取决于脚本语言,这里有无数的解决方案上)。
关于java - 如何以编程方式更改 XML 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41040743/