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

标签 spring grails spring-boot grails-3.3

我正在使用一个使用 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/

    相关文章:

    java - 在 Spring Boot 应用程序中处理或抛出异常的最佳实践是什么?

    java - 在 Spring 中使用 Authentication 类测试 Controller

    java - 如何从静态内部类构造函数创建 Spring bean?

    java - 上下文之间的Spring通信

    java - Spring Integration - 如何处理 LoggingHandler 的异常

    bash - 尝试在Grails中运行bash脚本时缺少属性

    exception - 保存操作时出现 MissingMethodException

    java - BeanCreationException : Invocation of init method failed

    eclipse - Grails重新生成Eclipse项目

    java - 在 spring boot 中定义重要凭据的最佳方式