使用数据库迁移时,我显然希望在迁移运行之前没有任何DAO可用。
目前我宣布很多的DAO,都拥有depends-on=databaseMigrator
属性。我觉得这很麻烦,特别是因为它容易出错。
有更紧凑的方法吗?
注意:
depend-on
作为迁移器。答案 0 :(得分:3)
我是在申请启动时这样做的。应用程序所需的模式版本作为构建过程的一部分编译到应用程序中。它也存储在数据库中,并由数据库迁移脚本进行更新。
在应用程序启动时,应用程序会检查数据库中的架构版本是否符合预期,如果没有,则会立即中止并显示错误消息。
在普通的Java程序中,这发生在main方法的开头。
在webapp中,它由应用程序的ServletContextListener执行,是创建servlet上下文时的第一件事。
这几次保存了我的(应用程序)培根。
答案 1 :(得分:3)
您可以尝试编写一个实现BeanFactoryPostProcessor接口的类来自动为您注册依赖项:
警告:此类尚未编译。
public class DatabaseMigratorDependencyResolver implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
String[] beanNames = beanFactory.getBeanDefinitionNames();
for (String beanName : beanNames) {
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName);
// Your job is here:
// Feel free to make use of the methods available from the BeanDefinition class (http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/beans/factory/config/BeanDefinition.html)
boolean isDependentOnDatabaseMigrator = ...;
if (isDependentOnDatabaseMigrator) {
beanFactory.registerDependentBean("databaseMigrator", beanName);
}
}
}
}
然后,您可以在所有其他bean中包含此类的bean。
<bean class="DatabaseMigratorDependencyResolver"/>
Spring会在开始启动剩余的bean之前自动运行它。
答案 2 :(得分:3)
我最终创建了一个简单的ForwardingDataSource
类,它在上下文文件中显示为:
<bean id="dataSource" class="xxx.ForwardingDataSource" depends-on="databaseMigrator">
<property name="delegate">
<!-- real data source here -->
</property>
</bean>
如果发现它不如Adam Paynter's solution那么优雅,但更清楚。