2017-08-08 31 views
1

我正在使用一个使用GORM 6.1.6.RELEASE,Spring-Boot 1.5.4.RELEASE和Spring Core 4.3.9.RELEASE的Grails 3.3应用程序。我试图声明一个在Hibernate开始验证底层数据库模式之前得到初始化的Spring bean。使用GORM 6.1.x确定Grails 3.3中的Springs bean实例化顺序

这是我喜欢做的事情。我想将我的Flyway注册为Spring bean,并将其注入到其中。为了在Hibernate开始验证当前数据库模式之前运行Flyway,我将我的flyway bean作为依赖添加到sessionFactory bean上。该命令将如下所示:

  1. dataSource
  2. flyway
  3. hiberateDatastore

格姆6.1用途org.grails.orm.hibernate.HibernateDatastore作为一个Spring bean来初始化Hibernate的ORM和数据库。 sessionFactory bean将hibernateDatastore#getSessionFactory声明为工厂类。 因此总是首先创建hibernateDatastore

在Grails 3.3中创建自定义Spring 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

Grails问题https://github.com/grails/grails-core/issues/10769 – saw303

回答

0

的Grails 3.3.0改变dataSource bean创建的机制。 Grails项目负责人在相关issue中声明:

先前版本的Grails与会话工厂分开创建了dataSource bean。被创建会话工厂之前,我们需要恢复这种行为我想是这样的数据源可以被引用,而不会触发了一个SessionFactory

创建升级到Grails的3.3.1 dataSource豆后再次可用。这解决了这个问题。

3

我不认为Spring提供了一个“豆instantion树”的,但是你可以为org.springframework.beans.factory.support.DefaultListableBeanFactory日志级别设置为DEBUG,你会得到这样的输出可视化:

创建单bean的共享实例“......完全合格的类名......”

返回singleton的bean的缓存实例“......完全合格的类名......”

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

我相信你会用成绩来声明DependsOn关系,只是为了完整性,这将是这样的:

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

    @Bean 
    @DependsOn("createHibernate") 
    public MyClass createMine() { 
     ... 
    } 
+0

感谢您的回复。对不起,我的问题不是很准确。我已经更新了它。通过日志记录的提示证明HibernateDatastore始终是第一个在线的。并且在数据存储之前没有其他明显的bean可以使用。 – saw303

+0

看看https://github.com/grails/grails-core/issues/10769 – saw303