1

我正在使用 Grails 3.3 应用程序,该应用程序在后台使用 GORM 6.1.6.RELEASE、Spring-Boot1.5.4.RELEASE和 Spring Core 。4.3.9.RELEASE我试图声明一个在 Hibernate 开始验证底层数据库模式之前被初始化的 Spring bean。

这是我喜欢做的事情。我想将我的 Flyway 注册为 Spring bean 并将dataSourcebean 注入其中。为了在 Hibernate 开始验证当前数据库模式之前运行 Flyway,我将我的flywaybean 作为依赖项添加到sessionFactorybean 上。顺序如下:

  1. dataSource
  2. flyway
  3. hiberateDatastore

GORM 6.1 使用org.grails.orm.hibernate.HibernateDatastoreSpring bean 来初始化 Hibernate ORM 和数据库。sessionFactorybean 声明hibernateDatastore#getSessionFactory为工厂类。因此,hibernateDatastore总是首先创建。

在 Grails 3.3 中创建自定义 Spring bean 的方法是什么,该 bean 必须在与数据库的连接可用但在 Hibernate 内容被初始化之前运行?

resources.groovy在以前的 Grails 3.x 版本中,可以像这样声明它。

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

2 回答 2

3

我不认为 Spring 提供了“bean 实例树”的可视化,但是您可以将日志级别设置为org.springframework.beans.factory.support.DefaultListableBeanFactoryto DEBUG,您将获得如下输出:

创建单例bean的共享实例'......完全限定的类名......'

返回单例 bean 的缓存实例“......完全限定的类名......”

您可以查看来自 Hibernate 命名空间的 bean 的日志输出。

我想你会使用结果来声明一个DependsOn关系,所以为了完整性,这看起来像:

   @Bean 
   public SomeHibernateClass createHibernate() {
       ...
   }

   @Bean
   @DependsOn("createHibernate")
   public MyClass createMine() {
       ...
   }
于 2017-08-08T15:58:33.403 回答
0

Grails 3.3.0 改变了dataSourcebean 创建的机制。Grails 项目负责人在相关问题中指出:

以前版本的 Grails 独立于会话工厂创建了 dataSource bean。我猜我们需要恢复这种行为,以便可以在不触发 sessionFactory 的创建的情况下引用 dataSource

升级到 Grails 3.3.1 之后,dataSourcebean 在会话工厂创建之前再次可用。这解决了问题。

于 2017-09-26T09:12:50.830 回答