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 :

Indiquer une propriete comme initialisateur


Sujet :

Spring Java

  1. #1
    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 Indiquer une propriete comme initialisateur
    Bonjour,

    Je voudrais savoir s'il est possible avec spring d'utiliser une propriété d'un objet pour en construire un autre un peu quelque chose comme ça :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <bean id="Bien" class="MaClasse"/>
    <bean id="TresBien" class="Autre">
     <constructor-arg ref="Bien.unGetter"/> <!-- CECI -->
    </bean>
    Si oui, pourriez-vous me dire où c'est indiqué parce que j'ai pas trouvé dans la doc...

    Et si non, on fait comment ?

  2. #2
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Salut,
    Une solution possible serait de faire que Bien implémente org.springframework.beans.factory.FactoryBean, et dans la méthode getObject tu retournes le résultat.
    Après, suffit de pointer vers ce bean pour que la valeur de retour de getObject soit sibstituée au bean :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <bean id="Bien" class="MaClasse"/>
    <bean id="TresBien" class="Autre">
     <constructor-arg ref="Bien"/> <!-- CECI -->
    </bean>

    Sinon, y'a aussi une autre méthode moins liée à Spring qui est :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <bean id="Bien" class="MaClasse"/>
    <bean id="TresBien" class="Autre">
     <constructor-arg index="0">
       <bean factory-bean="Bien" factory-method="unGetter" />
     </constructor-arg>
    </bean>

  3. #3
    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
    Sinon je pense que ceci peut t'aider
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  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 trouve que ceci est effectivement intéressant, merci.

    Le bean d'origine est lazy-inité. Si je mets un <util:property-path id="name" path="lazy.age"/>, cela ne risque-t-il pas de déclencher l'instanciation de lazy de façon intempestive (je veux dire, sans que je l'ai demendée dans mon programme) ?

    Dans l'ensemble, je suis un peu surpris qu'on ne puisse le faire directement. J'ai la sensation que quelque chose m'échappe dans la philosophie spring. Les objets ne sont-ils pas dans d'autres objets ? Donc n'est-il pas naturel de faire truc.muche ? Est-ce un antipattern dans le monde spring ? En spring on créé tous ses objets dans un fichier xml ? Ou faut-il mettre des FactoryBean comme le suggère djo.mos ?

  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
    Concernant le lazy-init, il y a effectivement de grande chose que le bean ciblé par la propriéte soit initialisé.
    Tu peux toujours mettre le bean qui pointe vers la propriéte de l'autre en lazy-init aussi.

    Concernant le fait que cela ne soit directement utilisable, je suppose que tu veux dire faire quelque chose comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <bean id="Bien" class="MaClasse"/>
    <bean id="TresBien" class="Autre">
     <constructor-arg ref="Bien.unGetter"/> <!-- CECI -->
    </bean>
    A titre d'information, un fonctionnement plus au moins similaire sera mis en place dans Spring 3.0 avec les expression languages.

    Tu devrais pouvoir faire quelques chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <bean id="Bien" class="MaClasse"/>
    <bean id="TresBien" class="Autre">
     <constructor-arg value="#{Bien.unGetter}"/> <!-- CECI -->
    </bean>
    Cela dit, ce sera complètement dynamique car cette expression sera resolvée à chaque utilisation au runtime.

    Autrement dit, si à un moment donné bien.unGetter vaut 5, et qu'elle est modifiée pour la valeur 42. Le bean "TresBien" sera conscient que cette valeur à été modifiée.

    Ce fonctionnement n'est pas le cas avec les factory Bean par exemple.
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  6. #6
    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, le fonctionnement 3.0 est bien celui que je souhaiterais.

    Ce que je ne comprends pas, c'est comment fait tout le monde jusqu'à présent, alors.

    J'ai une ancienne appli, que j'essaie de springuiser. Il y a dedans des objets que j'aimerais mettre sous la gouvernance - merci Rafarin - de spring, et d'autres non.

    Mon problème est de rendre les objets hors de la gouvernance de Spring visibles depuis Spring, car je peux avoir besoin des uns pour initialiser les autres.

    Ce doit être un problème courant, non ? Tout le monde fait par util:property, avec aucun objet lazy, ou bien comme a dit djo.mos, avec des implémentations perso de FactoryBean ? Mais j'ai peur que chez moi, pratiquement tout devienne une FactoryBean ??

Discussions similaires

  1. [Débutant] Binding de propriete comprenant une classe comme parametre
    Par Gualino dans le forum Windows Forms
    Réponses: 1
    Dernier message: 09/02/2014, 12h12
  2. [Utilier une table comme un tampon]
    Par Straahd dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 01/09/2005, 20h27
  3. comment construire une interface comme une pomme...
    Par redanium dans le forum C++Builder
    Réponses: 3
    Dernier message: 29/10/2004, 15h35
  4. une url comme argument d'une fonction
    Par khayyam90 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 18/10/2004, 20h15
  5. Passer une fonction comme argument à une fonction
    Par Cocotier974 dans le forum Général Python
    Réponses: 4
    Dernier message: 29/06/2004, 13h41

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