Убедитесь, что мой bean-компонент создан до sessionFactory

Я пытаюсь определить bean-компонент, который создается и инициализируется до Hibernate 4 sessionFactory, добавляя этот bean-компонент в resources.groovy

beans = {

    if (Environment.current == PRODUCTION) {
        flyway(Flyway) { bean ->
            bean.initMethod = 'migrate'
            dataSource = ref('dataSource')
            locations = 'migration/db/mysql'
            initOnMigrate = true
        }
    }
}

Нет, я хотел бы убедиться, что initMethod вызывается до создания sessionFactory без создания отдельного подключаемого модуля Grails.

Есть ли способ сделать это или уже слишком поздно, когда выполняется resources.groovy? Я хотел бы перенести данные с помощью bean-компонента dataSource и Flyway, но инициализировать bean-компонент Flyway до того, как sessionFactory начнет validate схему базы данных.


person saw303    schedule 22.07.2014    source источник


Ответы (2)


Через несколько часов я нашел ответ. В книге Берта Беквита Programming Grails есть глава под названием Bean Postprocessors, и вот как Spring ( или Grails) позволяет изменить существующее определение bean-компонента до завершения applicationContext.

 beans = {

     if (application.config.flyway.enabled) {

         flyway(Flyway) { bean ->
             bean.initMethod = 'migrate'
             dataSource = ref('dataSource')
             locations = application.config.flyway.locations
             initOnMigrate = application.config.flyway.initOnMigrate
         }

         def sessionFactoryBeanDef = getBeanDefinition('sessionFactory')
         if (sessionFactoryBeanDef) {
             // make it depend on my bean
             sessionFactoryBeanDef.dependsOn = ['flyway'] as String[]
         }
     }
 }
person saw303    schedule 22.07.2014

Я не уверен на 100%, но я думаю, что IntializingBean выполняется до того, как будут созданы Spring bean-компоненты, в том числе sessionFactory.

public class SomeService implements InitializingBean {

    public void afterPropertiesSet() throws Exception {

    //initialization logic goes here

     }      
}

Я не уверен, что вы можете получить доступ к datasource, если вы не можете создать его, создайте его вручную, а затем используйте.

person bitkot    schedule 22.07.2014
comment
afterPropertiesSet вызывается после создания компонента. но я не могу контролировать порядок (--> перед sessionFactory bean-компонентом) - person saw303; 22.07.2014