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 :

Plusieurs instances d'un bean [Data]


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    457
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 457
    Par défaut Plusieurs instances d'un bean
    Bonjour,

    J'ai défini un "Manager" et un "DAO" commun qui permet d'accéder à différentes tables de ma base de données (hibernate derrière).

    Dans mon controlleur, j'utilise @Autowired et @Qualifier pour automatiquement instancier mon manager. Cela fonctionne correctement mais me voici confronter à un problème. Je désire instancier plusieurs fois ce manager pour différentes classes..

    Voici mon Controller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    	@Autowired
    	@Qualifier("commonManager")
    	private CommonManager<TypeLieu> tlocationManager;
    	@Autowired
    	@Qualifier("commonManager")
    	private CommonManager<TypeCommunication> tcommManager;
    	@Autowired
    	@Qualifier("commonManager")
    	private CommonManager<Initiative> initiativManager;	
     
     
     
      @Override
    protected Map referenceData(HttpServletRequest request, Object command,
    		Errors errors, int page) throws Exception {
    		Map<Object, Object> dataMap = new HashMap<Object, Object>();
    		tlocationManager.loadClass(TypeLieu.class);
    		dataMap.put("typeLocList",this.tlocationManager.getList());
    		tcommManager.loadClass(TypeCommunication.class);
    		dataMap.put("typeCommList",this.tcommManager.getList());
    		initiativManager.loadClass(Initiative.class);
    		dataMap.put("initiList",this.initiativManager.getList());
     
    	 	return dataMap;
    }
    ..
    ..
    ..
    Et il se trouve que tlocationManager, tcommManager et initiativManager font référence au même objet !

    Voici aussi une partie de mon springmvc-servlet.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      <bean id="commonManager" parent="transactionProxy">
        <property name="target">
    		<ref bean="commonManagerTarget"/>
    	</property>
    	<property name="transactionAttributeSource">
    		<bean class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource"/>
    	</property>
    </bean>
     
     <bean id="commonManagerTarget" class="cbc.ccrt.service.impl.CommonManagerImpl" />
    J'ai essayé de chercher un peu, j'ai cru comprendre qu'il était possible de mettre comme attribut ou propriété : singleton="false" .
    J'ai tenté mais il me dit que cet attribut ou cette propriété est invalide..

    Comment puis-je procéder ??
    J'espère que vous pourrez m'en dire plus.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 141
    Par défaut
    Bonjour c'est normal que les 3 objets font référence à un seul et même objet, c'est ce que tu leur demandes de faire. Soit tu crées dans ton conteneur 3 objets pour chacun de tes classes peristantes, soit tu crées un seul manager capable d'utiliser n'importe quelle classe.

  3. #3
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    457
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 457
    Par défaut
    Il n'est pas possible, avec la même définition du bean, d'utiliser différentes instances ?
    Si je le réplique dans mon springmvc-servlet.xml , ce sera 100% redondant, seul le nom change o_O

  4. #4
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    457
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 457
    Par défaut
    même si je duplique les beans Manager, je suis confronté au probleme puisque je suppose, c'est mon DAO qui reste toujours unique dans les trois cas..
    Controller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    @Autowired
    	@Qualifier("commonManager")
    	private CommonManager<TypeLieu> tlocationManager;
    	@Autowired
    	@Qualifier("commonManager2")
    	private CommonManager<TypeCommunication> tcommManager;
    	@Autowired
    	@Qualifier("commonManager3")
    	private CommonManager<Initiative> initiativManager;
    xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    <bean id="commonManager" parent="transactionProxy">
        <property name="target">
    		<ref bean="commonManagerTarget"/>
    	</property>
    	<property name="transactionAttributeSource">
    		<bean class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource"/>
    	</property>
    </bean>
      <bean id="commonManager2" parent="transactionProxy">
        <property name="target">
    		<ref bean="commonManagerTarget2"/>
    	</property>
    	<property name="transactionAttributeSource">
    		<bean class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource"/>
    	</property>
    </bean>
      <bean id="commonManager3" parent="transactionProxy">
        <property name="target">
    		<ref bean="commonManagerTarget3"/>
    	</property>
    	<property name="transactionAttributeSource">
    		<bean class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource"/>
    	</property>
    </bean>
     
     
      <bean id="commonManagerTarget" class="pjx.service.impl.CommonManagerImpl" /> 
      <bean id="commonManagerTarget2" class="pjx.service.impl.CommonManagerImpl" /> 
      <bean id="commonManagerTarget3" class="pjx.service.impl.CommonManagerImpl" />
    Manager :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    @Transactional (readOnly=true, propagation=Propagation.REQUIRED)
    public class CommonManagerImpl<R> implements CommonManager<R>{
     
    	@Autowired
    	private CommonDao<R> myDao=null;
    	private Class classBean;
     
     
    	public List<R> getList() {
     
    		return myDao.getList();
    	}
     
    	public R getObjById(Long id) {
     
    		return myDao.getObjById(id);
    	}
     
    	public void loadClass(Class classBean) {
    		this.classBean = classBean;
    		myDao.loadClass(classBean);
    	}
     
    }

    [EDIT] J'ai trouvé un moyen de m'en sortir, mais je suis toujours interessé par votre réponse.
    Merci d'avance !

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 476
    Par défaut
    Salut,

    Si je le réplique dans mon springmvc-servlet.xml , ce sera 100% redondant, seul le nom change o_O
    Utilise un bean parent (comme tu l'as déjà fait) qui sera le parent de tes 3 beans manager.

    (pas testé)
    bean parent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <bean id="abstractCommonManager" abstract="true" parent="transactionProxy">        
     <property name="target">
    		<ref bean="commonManagerTarget"/>
     </property>
     <property name="transactionAttributeSource">
       <bean class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource"/>
      </property>
    </bean>
    bean manager :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <bean id="commonManager" parent="abstractCommonManager" />
    <bean id="commonManager2" parent="abstractCommonManager" />
    <bean id="commonManager3" parent="abstractCommonManager" />

    <bean id="commonManagerTarget" class="pjx.service.impl.CommonManagerImpl" />
    <bean id="commonManagerTarget2" class="pjx.service.impl.CommonManagerImpl" />
    <bean id="commonManagerTarget3" class="pjx.service.impl.CommonManagerImpl" />
    Cette triple déclaration ne me semble pas utile si pjx.service.impl.CommonManagerImpl est ton DAO commun aux 3 managers.
    Un seul bean te suffit.

  6. #6
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    457
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 457
    Par défaut
    Salut,

    Merci pour ta réponse.
    Comme je le disais précédemment, le résultat est pareil puisqu'ils utiliseront tous le même DAO. Je dois adapter ceci aussi au DAO.
    J'ai résolu le problème avec une variable classBean dans celui-ci et dès que je veux l'utiliser, je lui passe le bon type de classe grâce au setter.

    Quelque chose que je ne comprends pas vraiment. Dans mon exemple, j'avais donc trois variables qui référençaient le même bean "CommonManager". Comment est-ce possible qu'une même instance d'un objet puisse être utilisée avec différentes déclarations ?
    Je veux dire par là, j'ai UNE instance du bean CommonManager mais une fois comme <TypeLieu>, une fois comme <TypeCommunication> et une fois comme <Initiative>...

    Pouvez-vous m'expliquer ceci ?
    Merci

  7. #7
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 64
    Par défaut
    Citation Envoyé par libuma Voir le message
    J'ai essayé de chercher un peu, j'ai cru comprendre qu'il était possible de mettre comme attribut ou propriété : singleton="false" .
    J'ai tenté mais il me dit que cet attribut ou cette propriété est invalide..
    Depuis Spring 2, cette propriété singleton a été remplacée par la notion de scope :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <bean id="singletonBean" class="my.bean.MyBeanClass" scope="singleton" />
    <bean id="nonSingletonBean" class="my.bean.MyBeanClass" scope="prototype" />
    Le scope « prototype » permet d'obtenir plusieurs instances d'un même bean. Le scope « singleton » porte un nom très explicite, et c'est – sauf erreur de ma part – le scope par défaut.

  8. #8
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    457
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 457
    Par défaut
    Bonjour,

    Merci pour votre intervention.
    Effectivement, ça ne provoque ni erreur, ni warning, mais étrangement, les trois beans partagent toujours la même instance o_O

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

Discussions similaires

  1. Plusieurs instances d'un même bean ?
    Par fabaud dans le forum JSF
    Réponses: 12
    Dernier message: 31/10/2013, 15h20
  2. Réponses: 4
    Dernier message: 19/04/2005, 13h42
  3. Réponses: 3
    Dernier message: 16/10/2003, 10h22
  4. Communiquer entre plusieurs instances d'applications
    Par bourinator dans le forum C++Builder
    Réponses: 5
    Dernier message: 28/09/2003, 11h24
  5. [] plusieurs instances de form avec leur contexte ?
    Par Seb-31 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 11/04/2003, 13h56

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