我正在使用Grails 3.3应用程序,它在场景后面使用GORM 6.1.6.RELEASE
,Spring-Boot 1.5.4.RELEASE
和Spring Core 4.3.9.RELEASE
。我试图在Hibernate开始验证底层数据库模式之前声明一个初始化的Spring bean。
这是我喜欢做的事情。我想将我的Flyway注册为Spring bean并将dataSource
bean注入其中。为了在Hibernate开始验证当前数据库模式之前运行Flyway,我将flyway
bean作为依赖项添加到sessionFactory
bean中。订单如下:
dataSource
bean flyway
bean hiberateDatastore
bean GORM 6.1使用org.grails.orm.hibernate.HibernateDatastore
作为Spring bean来初始化Hibernate ORM和数据库。 sessionFactory
bean将hibernateDatastore#getSessionFactory
声明为工厂类。
因此,始终首先创建hibernateDatastore
。
Grails 3.3中创建自定义Spring bean的方法是什么,该bean必须在连接到数据库之后但在Hibernate内容初始化之前运行?
在Grails 3.x的早期版本中,可以在resources.groovy
中声明它。
beans = {
if (Environment.current == Environment.PRODUCTION) {
flyway(Flyway) { bean ->
bean.initMethod = 'migrate'
dataSource = ref('dataSource')
locations = 'classpath:db/h2'
baselineOnMigrate = true
}
BeanDefinition sessionFactoryBeanDef = getBeanDefinition('hibernateDatastore')
if (sessionFactoryBeanDef) {
def dependsOnList = ['flyway'] as Set
if (sessionFactoryBeanDef.dependsOn?.length > 0) {
dependsOnList.addAll(sessionFactoryBeanDef.dependsOn)
}
sessionFactoryBeanDef.dependsOn = dependsOnList as String[]
}
}
}
答案 0 :(得分:3)
我不认为Spring提供了'bean instantion tree'的可视化,但是您可以将org.springframework.beans.factory.support.DefaultListableBeanFactory
的日志级别设置为DEBUG
,并且您将获得如下输出:
创建单例bean的共享实例'...完全限定的类名...'
返回单例bean的缓存实例'...完全限定的类名...'
您可以从Hibernate名称空间查看Bean的日志输出。
我假设您将使用结果来声明DependsOn
关系,所以为了完整性,这将是:
@Bean
public SomeHibernateClass createHibernate() {
...
}
@Bean
@DependsOn("createHibernate")
public MyClass createMine() {
...
}
答案 1 :(得分:0)
Grails 3.3.0改变了dataSource
bean创建的机制。 Grails项目负责人在相关的issue:
以前版本的Grails分别从会话工厂创建了dataSource bean。我想我需要恢复这种行为,所以可以引用dataSource而不会触发sessionFactory的创建
升级到Grails 3.3.1后,dataSource
bean在创建会话工厂之前再次可用。这解决了这个问题。