确保我的bean在sessionFactory之前创建

时间:2014-07-22 17:06:08

标签: hibernate grails flyway

我正在尝试通过将此bean添加到sessionFactory

来定义在Hibernate 4 resources.groovy之前创建和初始化的bean。
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时为时已晚?我想使用dataSource bean和Flyway迁移数据,但在sessionFactory开始validate数据库模式之前初始化Flyway bean。

2 个答案:

答案 0 :(得分:3)

几个小时后我找到了答案。在Burt Beckwiths Book Programming Grails中有一章名为Bean Postprocessors,这就是Spring(或Grails)允许您在applicationContext最终确定之前修改现有bean定义的方法。

 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[]
         }
     }
 }

答案 1 :(得分:0)

我不是百分百肯定,但我认为IntializingBean在创建包含sessionFactory的spring bean之前执行。

public class SomeService implements InitializingBean {

    public void afterPropertiesSet() throws Exception {

    //initialization logic goes here

     }      
}

我不确定您是否可以访问datasource,如果您无法创建,则手动创建然后再使用它。