制作许多豆子的简短方法取决于一个豆子

时间:2009-06-06 12:03:13

标签: java spring

使用数据库迁移时,我显然希望在迁移运行之前没有任何DAO可用。

目前我宣布很多的DAO,都拥有depends-on=databaseMigrator属性。我觉得这很麻烦,特别是因为它容易出错。

有更紧凑的方法吗?


注意:

3 个答案:

答案 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那么优雅,但更清楚。