我正在尝试通过将此bean添加到sessionFactory
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。
答案 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
,如果您无法创建,则手动创建然后再使用它。