使用GORM 6.1.x确定Grails 3.3中的Springs bean实例化顺序

时间:2017-08-08 15:26:16

标签: spring grails spring-boot grails-3.3

我正在使用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中。订单如下:

  1. dataSource bean
  2. flyway bean
  3. hiberateDatastore bean
  4. 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[]
            }
        }
    }
    

2 个答案:

答案 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在创建会话工厂之前再次可用。这解决了这个问题。