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 :

variable globale/via SPRING


Sujet :

Spring Java

  1. #1
    Membre éclairé Avatar de jamesleouf
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 522
    Par défaut variable globale/via SPRING
    Bonjour, j'ai plusieurs classes, et deux bean (dao / l'autre pour les accès indirects), j'aimerais créer une variable globale dans le sens ou, n'importe ou je la place, je peux la modifier.
    Dans le cas présent, il s'agirait d'un tableau.
    le souci, c'est (sans doute parce qu'avec spring qui n'agit que sur un bean) qu'il remet tout a zéro a chacun de mes appels de fonction.
    Donc si je fais une insertion (ou plusieurs) il ne fait qu'écraser les données précédentes....
    j'aimerais donc pouvoir stocker ces informations dans un tableau et les conserver (SANS PASSER PAR UNE BDD sinon je meprendrais pas la tete sur ça).
    Si cela n'est pas possible, je serais contraint de passer par des flux vers des fichiers texte...

    MErci

  2. #2
    Membre éprouvé Avatar de we.are.the.storm
    Profil pro
    Inscrit en
    Février 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 115
    Par défaut
    Bonjour,

    Quel est le scope de ton bean contenant ton tableau ?

  3. #3
    Membre éclairé Avatar de jamesleouf
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 522
    Par défaut
    ce sont des prototype;
    justement, je me disais que ça pouvait marcher comme ça, mais ça ne change rien;
    En fait grosso modo; j'ai un form, qui fait appel a une fonction insert, qui doit insérer dans un tableau d'objet au rang i dés que tableau[i]!=null
    mais en fait il remplit à chaque fois tableau[0]

  4. #4
    Membre éprouvé Avatar de we.are.the.storm
    Profil pro
    Inscrit en
    Février 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 115
    Par défaut
    Avec le scope prototype le bean sera instancié à chaque appel. Il faut donc spécifier un scope singleton (ou ne pas définir de scope puisque c'est le scope par défaut) pour ton bean contenant le tableau.

  5. #5
    Membre éclairé Avatar de jamesleouf
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 522
    Par défaut
    oui mais justement, au départ c'était des singleton;
    puis comme ca marchait pas, j'ai essayer avec des proto mais rien n'y fait.
    En fait C'est l'un de mes bean qui contient un tableau d'objet, est ce que ce tableau d'objet est a décrire dans l'applicationContext en temps que property?
    si oui, comment?
    (c'est un tableau d'objet contenant deux String)

    De plus, je pensais que les singleton étaient instanciés à chaque fois, puisque comme son nom l'indique il est 'single'....?

  6. #6
    Membre éprouvé Avatar de we.are.the.storm
    Profil pro
    Inscrit en
    Février 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 115
    Par défaut
    Si ça ne fonctionne pas en scope singleton c'est que le problème ne vient pas de Spring.
    Peux tu nous fournir ton code de mise à jour de ton tableau ?

  7. #7
    Membre éclairé Avatar de jamesleouf
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 522
    Par défaut
    et bien,
    j'ai un LivreDAO
    puis un LivreDAOimpl avec les fonctions de manipulation de tableau et le tableau en lui même

    j'ai une interface: livreInt et une classe LivreIntImpl contenant un élément LivreDAO

    Le code en lui-même (je l'ai pas sur moi), mais je passe par l'objet DAO, et les fonction de manip: insert, delete, update, listing

    j'ai donc 2 bean dans mon applicationContext.xml

  8. #8
    Membre éprouvé Avatar de we.are.the.storm
    Profil pro
    Inscrit en
    Février 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 115
    Par défaut
    Oui l'architecture est correcte pas de soucis là dessus.
    Par contre sans le code de LivreDAOimpl et éventuellement le contenu d' applicationContext.xml je ne crains de ne pouvoir t'aider à résoudre ton problème.

  9. #9
    Membre éclairé Avatar de jamesleouf
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 522
    Par défaut
    voila pour l'AP :

    <bean id="LivreDAO" class="application.dao.LivreDAOimpl" scope="prototype">
    </bean>

    <bean id="LivreInt" class="application.service.LivreIntImpl" scope="prototype">
    <property name="livredao" ref="LivreDAO"/>
    </bean>
    je suppose que tu parlais plutot de LivreDAOimpl avec toutes les fonctions (je peux y accéder pas de soucis depuis LivreIntimpl; je pense plutot que c'est mon tableau qui est au mauvais endroit sans doute...
    Voici le code (simplifié)

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    public class LivreDAOimpl implements LivreDAO{
     
    	public Livre[] tab_livre = new Livre[100];
     
    	//ici le vrai code
    	public void init(){
    		for(int i=0;i<100;i++){
    		tab_livre[i]=new Livre(); //mise à null des 2 champs String
    		}
    	}
     
    	public int delete(Livre livre) {
    		// TODO Auto-generated method stub
    		return 0;
    	}
     
    	public void insert(Livre livre) {
    		// TODO Auto-generated method stub
    	System.out.println(livre._auteur);
    	System.out.println(livre._titre);
    	int i=0;
    	while (tab_livre[i]._auteur!=null){
    		i=i+1;
    	}
    	tab_livre[i]=livre;
    	System.out.println("i = " + i);
    	System.out.println("i = " + tab_livre[i]._auteur);
    	System.out.println("i = " + tab_livre[i]._titre);
     
    	}
     
    	public Livre[] list() {
    		// TODO Auto-generated method stub
    		return this.tab_livre;
    	}
     
    	public int update(Livre livre) {
    		// TODO Auto-generated method stub
    		return 0;
    	}
     
    	public void out(String s) {
    		// TODO Auto-generated method stub
    		System.out.println(s);
    	}
     
    }
    et le début de LivreIntimpl:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class LivreIntImpl implements LivreInt{
     
    	private LivreDAO livredao;
     
    	public void init() 
    	{
    		livredao.init();
    	}
    	//et bla bla bla

    Merci en tout cas

  10. #10
    Membre éclairé Avatar de jamesleouf
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 522
    Par défaut
    sans doute que le tableau est peut être mal placé....
    mais je vois pas vraiment ou le mettre pour que toutes les classes de tous mes packages puissent y avoir accès...

    Edit : sans que ça crée une nouvelle instance, puisqu'apparemment, a chaque fois que je fais un insert, il part d'un tableau vide, et instancie un nouveau tableau a chaque fois ce qui explique qu'il ne remplisse que le rang un a chaque fois;

    Par contre, je peux assurer que la fonction init() n'est appelé qu'une seule fois!!
    C'est pour ça que je pense qu'il s'agit de nouvelles instances à chaque fois

  11. #11
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2008
    Messages : 63
    Par défaut
    Citation Envoyé par jamesleouf Voir le message
    De plus, je pensais que les singleton étaient instanciés à chaque fois, puisque comme son nom l'indique il est 'single'....?
    Non, le singleton n'est instancié qu'au démarrage de spring.On parle de singleton car une seule instance n'est possible dans le container spring.En prototype par contre, des instances seront crées à chaque appel à la factory. Il est généralement préférable d'utiliser des singletons (sauf si on a vraiment besoin d'un comportement différent).

    Je vois que tu utilises une méthode init(). Avec spring, tu peux avoir une méthode init() qui se lance lors spring démarre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <bean id="monBean" class="MonBean" init-method="init"/>
    La méthode invoquée ne doit pas avoir d'argument. Pour le type de retour, je crois qu'on peut en avoir un, mais je suis plus sur. De toutes façons, le type de retour ne peut être exploité. Il faudra que je teste pour voir.
    Bref, c'est bien utile.

  12. #12
    Membre éclairé Avatar de jamesleouf
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 522
    Par défaut
    la méthode init dans Spring n'a pas de retour c'est un void.
    mais j'appelle la fonction init depuis une action struts, donc j'ai pas vraiment besoin de passer par l'applicationContext, même si c'est plus intelligent sans doute.

    Pardon pour la question de débutant mais c'est quoi factory? l'applicationContext.xml?

  13. #13
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2008
    Messages : 63
    Par défaut
    Je viens de tester avec Spring 2.5 + annotations, le void n'est pas obligatoire. : pas d'erreur. C'est pas très utile vu qu'on peut pas récupèrer le résultat, mais c'est possible.

    La factory, c'est un des un des fondamentaux de spring. Son utilisation est la plupart du temps masquée par Spring lui même. C'est ce qui construit est fourni les beans. Elle est principalement utilisé lors de l'injection. Donc d'une certaine façon, oui, c'est ton applicationContext, mais pas seulement.

    J'imagine que tu récupères ton bean LivreInt via un ApplicationContextAware, donc si ton bean est en prototype à chaque appel de ***.getBean("livreInt"), tu vas récupérer une nouvelle instance, c'est pourquoi tu devrais un scope singleton qui lui vivra aussi longtemps que l'application est en marche sur le serveur.
    Donc comme disait, we.are.the.storm si en singleton ça marche pas, c'est que le problème ailleurs.

  14. #14
    Membre éclairé Avatar de jamesleouf
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 522
    Par défaut
    oui oui,
    Merci novembre pour les renseignements;
    En fait non j'utilise pas de applicationcontextAware, j'attaque direct avec classpathxmlApplicationcontext(chemin) et ça fonctionne...

    je viens de récupérer une grosse dos sur spring et je me susi renseigné sur les singleton/proto
    En effet, les proto crée une nouvelle instance a chaque appel, c'est l'intérêt puisque je voulais les mettre dans un tableau.
    Comment faire pour les mettre dans un tableau?
    Ou, y a t-il une commande pour chopper toutes les instances créent par spring.

    Merci à tous

    PS: je viens de capter que j'avais pas mis de constructeur vide... C'est bizarre que mon programme ait quand même fonctionné...

Discussions similaires

  1. Connexion base mysql via variable globale
    Par Yozol dans le forum Développement de jobs
    Réponses: 4
    Dernier message: 23/12/2009, 11h51
  2. Cacher Variable Url avec Variable Globale
    Par danuz dans le forum XMLRAD
    Réponses: 6
    Dernier message: 26/09/2003, 17h20
  3. Variable "globale" (dans plusieurs templa
    Par mattmat dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 17/06/2003, 19h22
  4. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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