web-dev-qa-db-fra.com

Combien d'instances créées pour singleton bean faisant référence à un bean session/prototype

J'ai un doute sur le nombre d'instances qui seront créées dans le scénario mentionné ci-dessous, lorsque Spring est utilisé:

La configuration du bean est comme ça

  <bean id="a" class="A">
    <property name="b" ref="b"/>
    </bean>

<bean id="b" class="B" scope="session"/> or

 <bean id="b" class="B" scope="prototype"/>

Par défaut, le bean "a" a singleton scope. Il existe donc un bean singleton avec une référence à un bean avec une étendue de session ou une étendue de prototype.

Dans ce cas, s'il y a 2 demandes simultanées à l'application, combien d'instances de A seront créées et combien d'instances de B seront créées?

Ce sera très utile si quelqu'un peut expliquer comment cela fonctionne?

Merci, Divya

22
user1477232

Le singleton scope

Lorsqu'un bean est une singleton, une seule instance partagée du bean sera gérée et toutes les demandes de beans avec un ou plusieurs id correspondant à cette définition de bean entraîneront le renvoi d'une instance de bean spécifique par le conteneur Spring.

En d'autres termes, lorsque vous définissez une définition de bean et que celle-ci est définie comme un singleton, le Spring IoC container sera create exactly one instance of the object défini par cette définition de bean. Cette instance unique sera stockée dans une mémoire cache de ces beans singleton, et toutes les demandes et références ultérieures pour ce bean nommé entraîneront le renvoi de l'objet mis en cache.

La portée de la session

Avec la définition de bean ci-dessus en place, le conteneur Spring crée une nouvelle instance du bean pour le lifetime of a single HTTP Session.

Selon la référence du cadre Spring, une approche différente doit être suivie dans les cas où une classe qui "lives longer" (bean singleton dans ce cas) doit être injectée avec une autre classe ayant une durée de vie comparativement plus courte (bean à portée de session). L'approche est différente pour les prototypes et singleton scope cependant.

Dans votre XML, ce que nous souhaitons, c'est que l'instance singletonBean ne soit instanciée qu'une seule fois et qu'elle soit injectée avec sessionBean. Mais comme sessionBean est limité à la session (ce qui signifie qu'il devrait être ré-instancié pour chaque session), la configuration est ambiguë (les dépendances étant définies au moment de l'instanciation et la valeur de la portée de la session pouvant également changer ultérieurement).

Donc au lieu d’injecter avec cette classe, il s’injecte avec un proxy qui expose exactement la même interface publique que sessionBean. Le conteneur injecte cet objet proxy dans le bean singletonBean, qui ne sait pas que cette référence sessionBean est un proxy. Son spécifié en écrivant cette balise dans le sessionBean:

<aop:scoped-proxy/>

Configuration XML:

<bean name="singletonBean" class="somepkg.SingletonBean">
<property name="someProperty" ref="sessionBean"/>
</bean>

<bean name="sessionBean" class="somepkg.SessionBean" scope="session">
<aop:scoped-proxy/>
</bean>

Lorsqu'une instance singletonBean appelle une méthode sur l'objet sessionBean à dépendance injectée, elle appelle en fait une méthode sur le proxy. Le proxy récupère ensuite l'objet sessionBean réel (dans ce cas) de la session HTTP et délègue l'invocation de la méthode à l'objet sessionBean réel récupéré.

Sinon, veuillez consulter this pour plus d’informations.

Singleton Beans avec des dépendances prototype-bean

Injection de méthode de recherche

Lorsque vous utilisez des beans singleton-scoped avec des dépendances sur prototype beans, sachez que les dépendances sont résolues au moment de l'instanciation. Ainsi, si vous injectez un bean prototype-scoped dans un bean singleton, un nouveau bean prototype est instancié puis injecté une dépendance dans le bean singleton. L'instance prototype est la seule instance jamais fournie au bean à portée unique.

Cependant, supposons que vous souhaitiez que le bean singleton-scoped acquière de manière répétée une nouvelle instance du bean prototype-lissé, au moment de l'exécution. Vous ne pouvez pas injecter de dépendance dans un bean singleton, car cette injection ne se produit qu'une seule fois, lorsque le conteneur Spring instancie le bean singleton, puis résout et injecte ses dépendances.

<!-- a stateful bean deployed as a prototype (non-singleton) -->
<bean id="command" class="fiona.Apple.AsyncCommand" scope="prototype">
  <!-- inject dependencies here as required -->
</bean>

<!-- commandProcessor uses statefulCommandHelper -->
<bean id="commandManager" class="fiona.Apple.CommandManager">
  <lookup-method name="createCommand" bean="command"/>
</bean>

Lookup method injection est la capacité du conteneur à override methods on container beans gérés, pour renvoyer le résultat de la recherche d'un autre bean nommé dans le conteneur. La lookup implique généralement un prototype bean comme dans le scénario décrit dans la section précédente. Le framework Spring implémente cette injection de méthode en utilisant la génération de bytecode à partir du CGLIB library pour générer de manière dynamique une sous-classe qui remplace la méthode.

Référence injection de méthode de recherche .

Suivez pour des exemples et des informations plus détaillés.

35
Ankur Singhal

Si nous utilisons la méthode mentionnée dans la question, spring IOC créera toujours le même objet que singleton.

1) Injection de méthode de recherche 

2) Proxys Scoped

voir plus de détail ici

0
Surya