代码之家  ›  专栏  ›  技术社区  ›  Robert Munteanu

一粒豆,一粒豆。

  •  4
  • Robert Munteanu  · 技术社区  · 16 年前

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

    现在我宣布 很多 道家的人,都有一个 depends-on=databaseMigrator 财产。我觉得这很麻烦,特别是因为它容易出错。

    有更紧凑的方法吗?


    笔记:

    3 回复  |  直到 16 年前
        1
  •  3
  •   Adam Paynter    16 年前

    您可以尝试编写一个实现 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会自动运行它。

        2
  •  3
  •   Nat    16 年前

    我在应用程序启动时执行此操作。应用程序所需的架构版本作为生成过程的一部分编译到应用程序中。它还存储在数据库中,并由数据库迁移脚本更新。

    在应用程序启动时,应用程序会检查数据库中的模式版本是否符合预期,如果不是,则会立即中止,并显示一条明确的错误消息。

    在一个普通的Java程序中,这发生在主方法的开始。

    在webapp中,它是由应用的servletContextListener执行的,并且是在创建servlet上下文时所做的第一件事。

    这已经保存了我的(应用程序)培根好几次了。

        3
  •  3
  •   Community CDub    8 年前

    我最终创造了一个简单的 ForwardingDataSource 类,该类在上下文文件中显示为:

    <bean id="dataSource" class="xxx.ForwardingDataSource" depends-on="databaseMigrator">
       <property name="delegate">
          <!-- real data source here -->
       </property>
    </bean>
    

    如果发现它比 Adam Paynter's solution ,但更清楚。