IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Java Discussion :

Initialisation à l'utilisation et non à l'injection [Framework]


Sujet :

Spring Java

  1. #1
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut Initialisation à l'utilisation et non à l'injection
    Bonjour,

    J'ai actuellement un problème de dépendance cyclique en passant mes objets dans Spring.

    En fait, avec les dépendances en chaînes, les objets en initialisent d'autres qui dépendent des premiers et c'est le crash

    J'ai déja trouvé comment résoudre mon problème, il faut que mes beans soient initialisés non pas à l'injection, mais à l'utilisation.

    Est-ce qu'il existe une manière de faire cela de base dans Spring ou est-ce qu'il faut que je crée un nouveau factory bean qui n'initialisera l'instance que lors de la première utilisation et non pas directement ?

    Ce que j'aimerais donc, c'est quelque chose comme les proxy hibernate pour les listes lazy-loadées qui chargent les données que lorsque l'on demande le contenu de la liste.

    Merci d'avance

  2. #2
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Grooooooooooo c'est pas beau c'est pas bien ça

    Bon en attendant de mettre un peu d'ordre, peut être 3.3.4. Lazily-instantiated beans marchera-t-il ?

  3. #3
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut


    Ca je fais déja, tous mes beans sont en lazy-init par défaut, mais j'aimerais qu'ils soient initialisés à l'utilisation et non à l'injection comme avec lazy-init=true

  4. #4
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Je ne comprends pas très bien... s'ils sont en lazy-init alors ils ne devraient être créés qu'a l'usage... ou alors ce sont des singletons ? ou alors ils sont en dépendance d'un singleton ? Es-tu sûr qu'il n'y a pas un usage ?

  5. #5
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Par défaut
    Les beans de scope="prototype" sont unitialisé à l'utilisation, contrairement au singleton.

    Tu as quoi comme dépendances qui foirent ?
    Tu sais nous faire un petit topo ? :]
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  6. #6
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Les beans de type prototype, ça veut dire qu'il y en a qui sont créé à chaque utilisation, c'est juste, non ?

    Ce sont effectivement des singletons pour la plupart.

    Je vais essayer de donner un exemple :

    On a la classe Test1 qui est un bean :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Test1 {
         @Resource
         private IMainView mainView;
     
         public void build(){
              mainView.doSomething();
         }
    }
    et la classe MainView qui est également un bean :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class MainView implements IMainView{
         ...
    }
    Ce que j'aimerais ce que MainView ne soit pas initialisée lorsqu'elle est injectée dans Test1, mais seulement lorsqu'elle est utilisée dans Test1, c'est à dire à la ligne mainView.doSomething();

    Est-ce que c'est plus clair ?

  7. #7
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Oui c'est nettement plus clair mais ça me parait difficile.

    Sur quoi peux-tu jouer ? Le code source des classes, la config xml spring, les deux, aucun, autres opinions ?

  8. #8
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Je peux jouer sur tout, j'ai le code source de toutes les classes avec lesquelles j'interagis et c'est moi qui définit la configuration XML.

    Il me semble que c'est pas des plus difficiles avec un factory bean, non ? Il faudrait que j'utilise un proxy dynamique et un handler qui instancierait l'objet lors du premier appel de méthode.

    Mais donc, à priori, il n'existe rien de tel de base dans Spring ?

  9. #9
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Sur Spring je suis pas assez sûr de moi pour répondre oui ou non. Je soupçonne que Method Injection pourrait t'aider, mais cela m'a l'air bien compliqué.

    À ce que je compends il s'agirait de pouvoir coordonner deux injections concernant des beans aux cycles de vie différents.

    Je me suis déjà retrouvé en ce genre de cas, et comme paliatif provisoire j'essaie de refactorisaner en coupant les dépendances, avec comme approche de marquer @deprecated avec la mention MAL le code en cause, en rendant le bean context aware, et en manipulant moi même ses appels.

    Ainsi pour toi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // pour recevoir le contexte d'application
    // (il y aussi un truc style ApplicationContextAware)
    public class Test1 implements org.springframework.beans.factory.BeanFactoryAware
    et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
         public void build(){
     if (mainView == null)
     mainView = ctxspering.getBean("view");
              mainView.doSomething();
         }
    ... mais c'est du manuel, du provisoire, et pire que crade.

    Il y a aussu je pense des possibilités du coté des AOP, en prélude de la méthode build, mais des AOP sur du code à l'initialisation douteuse, j'aurais peur.

    Donc, en résumé, je crois qu'on peut répondre NON à ta question. Mais attend le mois de septembre pour être sûr, il y aura sans doute plus de spécialistes aux manettes.

  10. #10
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Comme apparemment ce n'est pas possible de base dans Spring, j'ai créé mon propre FactoryBean, ce qui marche très bien

    Merci à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/01/2009, 18h24
  2. Initialisation d'une DLL non mfc
    Par miwarrior dans le forum MFC
    Réponses: 4
    Dernier message: 14/05/2008, 01h07
  3. [UML] utilisation langage non objet
    Par untipy dans le forum UML
    Réponses: 5
    Dernier message: 10/08/2007, 16h30
  4. [2.0] Utiliser ou non un dataset
    Par Haks dans le forum Accès aux données
    Réponses: 3
    Dernier message: 08/11/2006, 23h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo