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 :

Accès au propiètés depuis une bean avec scope prototype


Sujet :

Spring Java

  1. #1
    Membre régulier Avatar de kodo
    Profil pro
    Chef de projet technique
    Inscrit en
    Mars 2006
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations professionnelles :
    Activité : Chef de projet technique

    Informations forums :
    Inscription : Mars 2006
    Messages : 300
    Points : 92
    Points
    92
    Par défaut Accès au propiètés depuis une bean avec scope prototype
    Bonjour,
    je travaille sur un projet avec spring mvc.
    J'ai 3 fichiers properties dans mon classpath : src/main/resources/application.properties,src/main/resources/messages.properties ,et src/main/resources/messages_fr.properties.
    Le fichier application.properties contient une propriété duree.refresh avec la valeur 5.
    duree.refresh=5
    J'ai une classe avec le scope prototype :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    @Component
    @Scope(value = "prototype")
    public class TraitementExecutor {
     
    	@Value("${duree.refresh}")
    	private String paramSleep;
    .....
    En déboguant, je trouve que la valeur de paramSleep est ${duree.refresh} et pas 5.
    Avec une singleton tous se passe bien.

    Avez vous une explication ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Comment créez-vous les instances de votre bean prototype ?

  3. #3
    Membre régulier Avatar de kodo
    Profil pro
    Chef de projet technique
    Inscrit en
    Mars 2006
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations professionnelles :
    Activité : Chef de projet technique

    Informations forums :
    Inscription : Mars 2006
    Messages : 300
    Points : 92
    Points
    92
    Par défaut
    Je fais un autowired
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    @Autowired
    private TraitementExecutor  traitementExecutor ;
    depuis une classe socket :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    @ServerEndpoint(value = "/wstraitement", encoders=TraitementEncoder.class, configurator = SpringConfigurator.class)
    public class TraitementSocket {

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Premier problème : le scope prototype ne servira à rien dans ce cas, cela sera toujours la même instance car les 2 beans seront créées au démarrage de l'application context.

    Un bean prototype différent est créé seulement via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ApplicationContext.getBean(PrototypeBean.class) ;
    Maintenant il existe différentes façons de provoquer cet appel si vous ne voulez pas le faire explicitement dans votre code (ce qui implique d'injecter l'application context):
    - en Spring 5 vous avez par exemple @Lookup
    - via l'API javax.inject et @Autowired Provider<PrototypeBean> provider; (un provider.get() retournera une nouvelle instance à chaque fois)
    - via un ObjectFactory et @Autowired ObjectFactory<PrototypeBean> factory; (factory.getObject(); retournera une nouvelle instance à chaque fois)

    Pour le @Value non injecté, cela peut être un problème de configuration de votre PropertySourcesPlaceholderConfigurer ou de vos property sources dans l'application context de la partie Web
    (est-ce que le @Value qui fonctionne dans un singleton est aussi un singleton du même contexte ? votre prototype est dans l'application context de la servlet...)

  5. #5
    Membre régulier Avatar de kodo
    Profil pro
    Chef de projet technique
    Inscrit en
    Mars 2006
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations professionnelles :
    Activité : Chef de projet technique

    Informations forums :
    Inscription : Mars 2006
    Messages : 300
    Points : 92
    Points
    92
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Premier problème : le scope prototype ne servira à rien dans ce cas, cela sera toujours la même instance car les 2 beans seront créées au démarrage de l'application context.
    Non, en loggant le nom de l'instance dans le constructeur par défaut, j'ai bien deux instances
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public TraitementExecutor(){
    		logger.info("Instance=======>"+this.toString());
    	}

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Avez-vous un autre @Autowired sur le prototype dans une autre bean singleton?

  7. #7
    Membre régulier Avatar de kodo
    Profil pro
    Chef de projet technique
    Inscrit en
    Mars 2006
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations professionnelles :
    Activité : Chef de projet technique

    Informations forums :
    Inscription : Mars 2006
    Messages : 300
    Points : 92
    Points
    92
    Par défaut
    Avez-vous un autre @Autowired sur le prototype dans une autre bean singleton?
    Non

  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par kodo Voir le message
    Non
    Vous avez un seul bean singleton avec @Autowired de l'autre bean, vous n'appelez pas explicitement ApplicationContext.getBean(TraitementExecutor.class) ailleurs, ni probablement new TraitementExecutor (),
    et vous avez 2 instances de TraitementExecutor, une seule de TraitementSocket ? et cela ne vous intrigue pas plus que çà ?

Discussions similaires

  1. Accès à un fichier depuis une procédure stockée
    Par greg75 dans le forum Sybase
    Réponses: 2
    Dernier message: 09/03/2007, 10h02
  2. Accès ip public depuis le LAN avec iptables
    Par korben06 dans le forum Sécurité
    Réponses: 12
    Dernier message: 19/11/2006, 21h55
  3. [BCB6]Appel d’une form depuis une form avec showmodal
    Par almisuifre dans le forum C++Builder
    Réponses: 4
    Dernier message: 13/11/2006, 19h14
  4. [EJB2] Accès Interface locale depuis une classe métier.
    Par rigor dans le forum Java EE
    Réponses: 2
    Dernier message: 10/10/2006, 14h44
  5. accés a oracle depuis une autre machine
    Par tounsi dans le forum Connexions aux bases de données
    Réponses: 10
    Dernier message: 16/01/2006, 17h06

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