Primavera - Bean Scopes

Quando si definisce un <bean> si ha la possibilità di dichiarare uno scope per quel bean. Ad esempio, per forzare Spring a produrre una nuova istanza di bean ogni volta che ne è necessaria una, è necessario dichiarare l'attributo scope del bean comeprototype. Allo stesso modo, se vuoi che Spring restituisca la stessa istanza del bean ogni volta che ne è necessaria una, devi dichiarare che l'attributo scope del bean siasingleton.

Spring Framework supporta i seguenti cinque ambiti, tre dei quali sono disponibili solo se si utilizza un ApplicationContext compatibile con il Web.

Sr.No. Ambito e descrizione
1

singleton

Questo ambito della definizione del bean a una singola istanza per contenitore Spring IoC (impostazione predefinita).

2

prototype

Ciò consente a una singola definizione di bean di avere un numero qualsiasi di istanze di oggetto.

3

request

Questo ambito da una definizione di bean a una richiesta HTTP. Valido solo nel contesto di Spring ApplicationContext compatibile con il Web.

4

session

Questo ambito da una definizione di bean a una sessione HTTP. Valido solo nel contesto di Spring ApplicationContext compatibile con il Web.
5

global-session

Questo definisce l'ambito di una definizione di bean in una sessione HTTP globale. Valido solo nel contesto di Spring ApplicationContext compatibile con il Web.

In questo capitolo, discuteremo dei primi due ambiti e degli altri tre quando parleremo di Spring ApplicationContext compatibile con il web.

L'ambito singleton

Se un ambito è impostato su singleton, il contenitore Spring IoC crea esattamente un'istanza dell'oggetto definito da quella definizione di bean. Questa singola istanza viene archiviata in una cache di tali bean singleton e tutte le richieste e i riferimenti successivi per quel bean denominato restituiscono l'oggetto memorizzato nella cache.

L'ambito predefinito è sempre singleton. Tuttavia, quando è necessaria una e una sola istanza di un bean, è possibile impostare l'estensionescope proprietà a singleton nel file di configurazione del bean, come mostrato nel seguente frammento di codice:

<!-- A bean definition with singleton scope -->
<bean id = "..." class = "..." scope = "singleton">
   <!-- collaborators and configuration for this bean go here -->
</bean>

Esempio

Cerchiamo di avere un IDE Eclipse funzionante e di eseguire i seguenti passaggi per creare un'applicazione Spring:

Passi Descrizione
1 Crea un progetto con un nome SpringExample e crea un pacchetto com.tutorialspoint sottosrc cartella nel progetto creato.
2 Aggiungere le librerie Spring richieste utilizzando l' opzione Aggiungi JAR esterni come spiegato nel capitolo Esempio Spring Hello World .
3 Crea classi Java HelloWorld e MainApp nel pacchetto com.tutorialspoint .
4 Crea il file di configurazione Beans Beans.xml sottosrc cartella.
5 Il passaggio finale consiste nel creare il contenuto di tutti i file Java e nel file di configurazione Bean ed eseguire l'applicazione come spiegato di seguito.

Ecco il contenuto di HelloWorld.java file -

package com.tutorialspoint;

public class HelloWorld {
   private String message;

   public void setMessage(String message){
      this.message  = message;
   }
   public void getMessage(){
      System.out.println("Your Message : " + message);
   }
}

Di seguito è riportato il contenuto del file MainApp.java file -

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
      HelloWorld objA = (HelloWorld) context.getBean("helloWorld");

      objA.setMessage("I'm object A");
      objA.getMessage();

      HelloWorld objB = (HelloWorld) context.getBean("helloWorld");
      objB.getMessage();
   }
}

Di seguito è riportato il file di configurazione Beans.xml richiesto per l'ambito singleton -

<?xml version = "1.0" encoding = "UTF-8"?>

<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <bean id = "helloWorld" class = "com.tutorialspoint.HelloWorld" scope = "singleton">
   </bean>

</beans>

Una volta terminata la creazione dei file di configurazione dei bean e dei sorgenti, eseguiamo l'applicazione. Se tutto va bene con la tua applicazione, stamperà il seguente messaggio:

Your Message : I'm object A
Your Message : I'm object A

Lo scopo del prototipo

Se l'ambito è impostato su prototipo, il contenitore Spring IoC crea una nuova istanza di bean dell'oggetto ogni volta che viene effettuata una richiesta per quel bean specifico. Di norma, utilizzare l'ambito prototipo per tutti i bean con stato completo e l'ambito singleton per i bean senza stato.

Per definire un ambito prototipo, è possibile impostare il scope proprietà a prototype nel file di configurazione del bean, come mostrato nel seguente frammento di codice:

<!-- A bean definition with prototype scope -->
<bean id = "..." class = "..." scope = "prototype">
   <!-- collaborators and configuration for this bean go here -->
</bean>

Esempio

Mettiamo in funzione l'IDE Eclipse e seguiamo i seguenti passaggi per creare un'applicazione Spring:

Passi Descrizione
1 Crea un progetto con un nome SpringExample e crea un pacchetto com.tutorialspoint sottosrc cartella nel progetto creato.
2 Aggiungere le librerie Spring richieste utilizzando l' opzione Aggiungi JAR esterni come spiegato nel capitolo Esempio Spring Hello World .
3 Crea classi Java HelloWorld e MainApp nel pacchetto com.tutorialspoint .
4 Crea il file di configurazione Beans Beans.xml sottosrc cartella.
5 Il passaggio finale consiste nel creare il contenuto di tutti i file Java e nel file di configurazione Bean ed eseguire l'applicazione come spiegato di seguito.

Ecco il contenuto di HelloWorld.java file

package com.tutorialspoint;

public class HelloWorld {
   private String message;

   public void setMessage(String message){
      this.message  = message;
   }
   public void getMessage(){
      System.out.println("Your Message : " + message);
   }
}

Di seguito è riportato il contenuto del file MainApp.java file -

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
      HelloWorld objA = (HelloWorld) context.getBean("helloWorld");

      objA.setMessage("I'm object A");
      objA.getMessage();

      HelloWorld objB = (HelloWorld) context.getBean("helloWorld");
      objB.getMessage();
   }
}

Di seguito è riportato il file di configurazione Beans.xml richiesto per l'ambito del prototipo -

<?xml version = "1.0" encoding = "UTF-8"?>

<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <bean id = "helloWorld" class = "com.tutorialspoint.HelloWorld" scope = "prototype">
   </bean>

</beans>

Una volta terminata la creazione dei file di configurazione dei bean e dei sorgenti, eseguiamo l'applicazione. Se tutto va bene con la tua applicazione, stamperà il seguente messaggio:

Your Message : I'm object A
Your Message : null