2017-08-08 1 views
1

J'utilise une application Grails 3.3 qui utilise GORM 6.1.6.RELEASE, Spring-Boot 1.5.4.RELEASE et Spring Core 4.3.9.RELEASE derrière la scène. J'essaie de déclarer un bean Spring qui est initialisé juste avant que Hibernate commence à valider le schéma de base de données sous-jacent.Déterminer l'ordre d'instanciation de beans Springs dans Grails 3.3 avec GORM 6.1.x

Voici ce que j'aime faire. Je veux enregistrer mon Flyway comme un haricot de printemps et y injecter le haricot dataSource. Pour que Flyway soit exécuté avant que Hibernate commence à valider le schéma de base de données actuel, j'ajoute mon bean flyway en tant que dépendance au bean sessionFactory. L'ordre serait le suivant:

  1. dataSource haricot
  2. flyway haricot
  3. hiberateDatastore haricot

GORM 6.1 utilisations org.grails.orm.hibernate.HibernateDatastore comme un grain de printemps pour initialiser la mise en veille prolongée ORM et la base de données. Le bean sessionFactory déclare le hibernateDatastore#getSessionFactory comme classe de fabrique. Par conséquent, le hibernateDatastore est toujours créé en premier.

Quelle est la façon Grails 3.3 pour créer un grain de printemps personnalisé qui doit courir après la connexion à la base de données est disponible, mais avant les choses se Hibernate initialisé?

Dans les versions précédentes de 3.x Grails, il était possible de le déclarer dans resources.groovy comme ça.

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 problème https://github.com/grails/grails-core/issues/10769 – saw303

Répondre

0

Grails 3.3.0 a changé le mécanisme de la création de haricot dataSource. Le chef de projet Grails indiqué dans le document associé issue:

Les versions précédentes de Grails ont créé le bean dataSource séparément de la fabrique de sessions. Nous aurions besoin de restaurer ce comportement je suppose que la source de données peut être référencé sans déclencher la création du sessionFactory

Après la mise à niveau Grails 3.3.1 le haricot dataSource est à nouveau disponible avant l'usine de la session est créée. Cela résout le problème.

3

Je ne pense pas que Spring fournit une visualisation d'un « haricot instantion arbre », vous pouvez toutefois définir le niveau de journal pour org.springframework.beans.factory.support.DefaultListableBeanFactory-DEBUG et vous obtiendrez la sortie comme ceci:

Création instance partagée de haricot singleton '... le nom complet de la classe ...'

retour instance mise en cache du haricot singleton '... le nom complet de la classe ...'

Vous pouvez consulter cette sortie de journal pour les beans à partir de l'espace de noms Hibernate.

Je suppose que vous allez utiliser les résultats pour déclarer une relation DependsOn si juste pour être complet cela ressemblerait à ceci:

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

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

Merci de répondre. Désolé ma question n'était pas très précise. Je l'ai mis à jour. Votre indice avec la journalisation a prouvé que le HibernateDatastore est toujours le premier en ligne. Et il n'y a pas d'autre bean évident que je pourrais utiliser avant le datastore. – saw303

+0

Jetez un oeil à https://github.com/grails/grails-core/issues/10769 – saw303