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 :

Spring et classes utilitaires


Sujet :

Spring Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 9
    Par défaut Spring et classes utilitaires
    Bonjour,

    j'initialise mon projet avec Spring.

    J'ai cependant une question : comment initialiser une variable dans une classe utilitaire (contenant uniquement des méthodes statiques) du genre :

    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
     
    public final Tools {
         /**
          * Injectée par Spring
         **/
         private static String path;
     
         private Tools(){
              //constructeur privé pour empecher l'instanciation
         }
     
         public static void setPath(String string){
              PATH = string;
         }
     
     
         public static void do(){
              //methode statique utlisant path
         }

    tout fonctionne en instanciant via <bean> et Spring un objet Tools mais je ne trouve pas cela très propre.

    en effet, Tools étant une classe statique, on ne devrait pas l'instancier (elle devrait même être definie abstract pour empecher vraiment l'instanciation).
    de plus path devrait etre definie en final (c'est une constante). j'ai viré final pour pouvoir l'initialiser avec Spring.

    ya-t-il une solution pour faire plus proprement (classe Tools abstraite, et PATH en constante...) ?

    Merci

  2. #2
    Nouveau membre du Club
    Inscrit en
    Août 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 9
    Par défaut
    personne n'a une idée ?

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Moi j'ai bien plusieurs idées :

    - Un <bean> ça sert à créer un objet ou une fabrique d'objets. Pas à setter des propriétés statiques. Et un applicationContext.xml, ça sert à définir des beans.
    Conclusion, c'est pas le bon outil. Un ServletContextListener qui s'occupe de régler ça, par exemple, serait sûrement plus adapté. Il pourrait lire l'info d'un fichier .properties.
    Dans le même genre, créer un bean sans id, d'une classe qui implémente InitializingBean, et dans son afterPropertiesSet() s'occupe d'appeler la méthode statique. Au fond, ça existe peut-être, mais j'en ai pas trouvé dans la doc. C'est quand même pas top comme usage.

    - Une méthode qui a besoin de configuration préalable pour fonctionner n'a pas à être statique. Elle doit être méthode membre d'une classe instanciée, la configuration étant faite à l'instanciation. L'instance doit être passée à tous ses utilisateurs.
    Bon, c'est vrai qu'il y a des exceptions, comme la configuration du logging. Et elle est faite avec des ServletContextListener. Disons que applicationContext.xml n'est pas conçu pour ça, même si on peut imaginer des cas où il s'agit d'injecter des dépendances.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre Expert
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Par défaut
    Tools étant une classe statique
    Moi je commencerais par me poser la question suivante : Tools est-elle une classe statique, si ses propriétés changent ?

    Les beans créés via Spring sont par défaut des singletons, donc il n'en existe qu'une seule instance. Cela remplace avantageusement la classe statique.
    D'ailleurs, le pattern Singleton remplace la classe statique dans de très nombreux cas (tous ?) sans Spring.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Août 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 9
    Par défaut
    Bonsoir,

    voila la question static/singleton.

    les proprietes statiques peuvent etre modifié dans l'évolution d'un programme...


    bon pour resoudre, je transforme ma classe static en une classe normal, avec utilisation du singleton initialisé par spring.


    je vais également regarder du coté du ServletContextListener.

    merci

  6. #6
    Nouveau membre du Club
    Inscrit en
    Août 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 9
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Il pourrait lire l'info d'un fichier .properties.
    les parametres en question sont bien tiré d'un fichier propertie et charge par Spring via propertyPlaceholder

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par polter Voir le message
    les proprietes statiques peuvent etre modifié dans l'évolution d'un programme...
    ... Mais ne doivent pas l'être.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Nouveau membre du Club
    Inscrit en
    Août 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 9
    Par défaut
    Citation Envoyé par thelvin Voir le message
    ... Mais ne doivent pas l'être.

    et pourquoi pas ? Les propriétés statiques (non finales) seront ainsi modifiées pour toutes les instances de cette classe.

    enfin bref, ca n'est pas le propos ici.

    Mes classes utilitaires utilisent un paramètre situé dans un fichier properties. C'est la que j'ai besoin de les initialiser. ensuite il est vrai queces parametres ne sont pas modifiés durant l'utilisation de mon appli.

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par polter Voir le message
    et pourquoi pas ?
    Parce que ça produit ce qui t'arrive là.
    C'est un sujet très vaste, notamment c'est générateur de bugs graves si le changement s'opère en contexte multithread, toujours le cas avec les applis web.

    Citation Envoyé par polter Voir le message
    Les propriétés statiques (non finales) seront ainsi modifiées pour toutes les instances de cette classe.
    C'est juste une variable globale. Mais non-constante. De l'anti-objet, ce qui risque de se payer. Tu es d'ailleurs en train de le faire.

    Citation Envoyé par polter Voir le message
    enfin bref, ca n'est pas le propos ici.
    Je t'ai déjà donné des solutions. ServletContextListener, ou InitializingBean sans id qui sert juste à appeler tes méthodes statiques dans son afterPropertiesSet().
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Nouveau membre du Club
    Inscrit en
    Août 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 9
    Par défaut
    Citation Envoyé par thelvin Voir le message
    C'est juste une variable globale. Mais non-constante. De l'anti-objet, ce qui risque de se payer. Tu es d'ailleurs en train de le faire.
    justement, il n'y a pas d'objet ici puisque classe utilitaire (-> static)


    Citation Envoyé par thelvin Voir le message
    Je t'ai déjà donné des solutions. ServletContextListener
    on sort du context spring. donc plus aucun interet a utiliser spring ici. on repart sur une gestion des porperties a l'ancienne.

    Citation Envoyé par thelvin Voir le message
    InitializingBean sans id qui sert juste à appeler tes méthodes statiques dans son afterPropertiesSet().
    pas fan, ca fait bricolage.

  11. #11
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par polter Voir le message
    justement, il n'y a pas d'objet ici puisque classe utilitaire (-> static)
    Et c'est tout le problème.
    D'ailleurs, les bugs graves de non-constance en environnement multithreadé, on s'en fiche ?

    Citation Envoyé par polter Voir le message
    on sort du context spring. donc plus aucun interet a utiliser spring ici. on repart sur une gestion des porperties a l'ancienne.
    Spring ne se limite pas aux ApplicationContext, et simplifie beaucoup la programmation de beaucoup de choses.
    Mais en effet, ApplicationContext n'est pas l'outil adapté pour ça, comme je l'ai dit.

    Comme je l'ai déjà indiqué, la configuration du logging, problème similaire par commodité, se fait avec un ServletContextListener. Fourni par Spring, s'appuyant sur des outils Spring.

    Citation Envoyé par polter Voir le message
    pas fan, ca fait bricolage
    L'idée de départ est un bricolage.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Nouveau membre du Club
    Inscrit en
    Août 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 9
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Et c'est tout le problème.
    D'ailleurs, les bugs graves de non-constance en environnement multithreadé, on s'en fiche ?
    tu peux m'en dire plus stp ?

  13. #13
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Ben, en résumé, une variable qui peut être lue et écrite par plusieurs threads, sans synchronisation, c'est pas fiable.

    On ne sait pas si la modification arrive avant, après, et le plus grave pendant lecture ou écriture par les autres threads.
    Ça peut facilement la mettre dans un état incohérent, et planter les threads qui comptent dessus. Voire faire des choses différentes de ce que ça doit faire.

    Ce n'est pas seulement un problème d'utilisation statique, remarque. La même chose est vraie avec un singleton. Mais en général la chose est mieux "maîtrisée," disons, quand on prend l'habitude d'utiliser un singleton. Notamment parce que d'habitude on s'arrange pour qu'il ne soit pas modifiable, et quand on change ça, on réfléchit aux questions de multithreading.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  14. #14
    Nouveau membre du Club
    Inscrit en
    Août 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 9
    Par défaut
    je ne pense pas avoir ce probleme puisque mes "outils" sont initialisés au demarrage de mon appli et ne sont ensuite plus modifiés.

    par contre, d'un autre coté de mon appli, j'ai bien reflechi à ce probleme de multithreading et normalement c'est béton !

  15. #15
    Membre Expert
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Par défaut
    Pour faire simple, une classe utilitaire est :
    - statique si ses propriétés sont constantes
    - un singleton (éventuellement avec des synchronisations dans le cas de multithreading) sinon.

  16. #16
    Nouveau membre du Club
    Inscrit en
    Août 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 9
    Par défaut
    bonjour,

    ma classe a bien des propriétés constantes mais initialisé au demarrage (stockée dans un fichier properties). d'ou mon utilisation de spring et propertyPlaceholder (qui n'est peut etre pas judicieux).

Discussions similaires

  1. [JavaScript] [SRC] Classe utilitaire pour la manipulation des URLs
    Par Oscar Hiboux dans le forum Contribuez
    Réponses: 8
    Dernier message: 29/09/2018, 17h40
  2. classe utilitaire « hibernateUtil.java »
    Par AmineDev9 dans le forum Hibernate
    Réponses: 1
    Dernier message: 12/06/2009, 09h46
  3. Fonction globales ou classe utilitaire ?
    Par oodini dans le forum C++
    Réponses: 9
    Dernier message: 03/09/2008, 15h16
  4. Classe utilitaire pour les formulaires
    Par sir_gcc dans le forum Zend_Form
    Réponses: 8
    Dernier message: 20/10/2007, 14h39
  5. CComboBox dans une classe utilitaire
    Par BakaOnigiri dans le forum MFC
    Réponses: 3
    Dernier message: 29/12/2006, 18h55

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