2009-01-14 4 views
16

Lorsque j'appelle getBean(name) sur un BeanFactory, je récupère une instance du bean définie dans le contexte de l'application. Cependant, quand j'appelle le getBean(name) encore (avec le même nom,) j'obtiens la même instance du haricot. Je comprends comment cela serait souhaitable dans certains cas (nombreux?), Mais comment puis-je dire au BeanFactory de me donner une nouvelle instance?Comment forcer un conteneur à ressort à ne pas renvoyer une instance singleton d'un bean?

Exemple de configuration Spring (... J'ai laconiquement laissé certains verbosité, mais cela ne devrait obtenir le point à travers):

<beans> 
    <bean id="beanA" class="misc.BeanClass"/> 
</beans> 

Exemple Java:

for(int i = 0;i++;i<=1) { 
    ApplicationContext context = ClassPathXmlApplicationContext("context.xml"); 
    Object o = context.getBean("beanA"); 

    System.out.println(o.toString()); // Note: misc.BeanA does not implement 
             // toString(), so this will display the OOID 
             // so that we can tell if it's the same 
             // instance 
} 

Quand je lance ce , Je reçois quelque chose comme:

[email protected] 
[email protected] 

Notez que les deux ont le même OOID ... donc ce sont les mêmes instances ... mais je voulait des instances différentes.

Répondre

33

Vous devez dire au printemps que vous voulez un grain de prototype plutôt que d'un grain de singleton

<bean id="beanA" class="misc.BeanClass" scope="prototype"/> 

Cela vous obtiendrez une nouvelle instance à chaque demande.

+0

Cela l'a fait. Deux choses ont déraillé moi: 1. Initialement, je cherchais un argument pour getBean (String), au lieu d'un attribut dans la configuration ... 2. Dans Spring 1.x (mon expérience printanière précédente), l'attribut s'appelait ' singleton ', mais cela ne fonctionne apparemment pas dans 2.5. – Jared

+0

Oui, ils l'ont changé en "scope" dans Spring 2.x pour accueillir la requête, la session et la session globale. – duffymo

+0

Si vous configurez via la classe Java ('@ Configuration'), vous pouvez' utiliser @Scope ("prototype") 'dans la méthode de définition du bean –

14

La valeur par défaut scope est singleton, mais vous pouvez la définir sur prototype, requête, session ou session globale.

+1

+1 pour le lien doc. Merci. – Jared

Questions connexes