Короткий способ приготовления многих бобов зависит от одного боба - PullRequest
4 голосов
/ 06 июня 2009

При использовании миграций базы данных я, очевидно, хочу, чтобы ни один из DAO не использовался до запуска миграций.

В данный момент я объявляю много DAO, все из которых имеют свойство depends-on=databaseMigrator. Я нахожу это беспокойство, тем более что оно подвержено ошибкам.

Есть ли более компактный способ сделать это?


Примечания:

Ответы [ 3 ]

3 голосов
/ 07 июня 2009

Вы можете попробовать написать класс, который реализует интерфейс 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 class="DatabaseMigratorDependencyResolver"/>

Spring автоматически запустит его, прежде чем начнет инициировать остальные компоненты.

3 голосов
/ 11 июня 2009

В итоге я создал простой класс ForwardingDataSource, который появляется в контекстных файлах как:

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

Если вы найдете его менее изящным, чем Решение Адама Пайнтера , но более понятное.

3 голосов
/ 06 июня 2009

Я делаю это при запуске приложения. Версия схемы, которая требуется приложению, компилируется в приложение как часть процесса сборки. Он также сохраняется в базе данных и обновляется сценариями миграции базы данных.

При запуске приложения приложение проверяет, что версия схемы в базе данных соответствует ожидаемой, и, если нет, немедленно прерывает работу с явным сообщением об ошибке.

В обычной Java-программе это происходит в самом начале метода main.

В веб-приложении оно выполняется ServletContextListener приложения и является первым, что оно делает при создании контекста сервлета.

Это спасло мой (приложения) бекон несколько раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...