我正在使用一个使用 GORM 6.1.6.RELEASE
的 Grails 3.3 应用程序, Spring Boot 1.5.4.RELEASE
和 Spring Core 4.3.9.RELEASE
在幕后。我试图声明一个在 Hibernate 开始验证底层数据库模式之前被初始化的 Spring bean。
这是我喜欢做的事情。我想将我的 Flyway 注册为 Spring bean 并注入(inject) 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[]
}
}
}
最佳答案
我不认为 Spring 提供了“bean 实例树”的可视化,但是您可以为 org.springframework.beans.factory.support.DefaultListableBeanFactory
设置日志级别。至DEBUG
你会得到这样的输出:
Creating shared instance of singleton bean '...fully qualified class name...'
Returning cached instance of singleton bean '...fully qualified class name...'
您可以查看来自 Hibernate 命名空间的 bean 的日志输出。
我想你会使用结果来声明
DependsOn
关系,所以为了完整性,这看起来像: @Bean
public SomeHibernateClass createHibernate() {
...
}
@Bean
@DependsOn("createHibernate")
public MyClass createMine() {
...
}
关于spring - 使用 GORM 6.1.x 在 Grails 3.3 中确定 Springs bean 实例化顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45572338/