Quando si definisce un <bean> si ha la possibilità di dichiarare uno scope per quel bean. Per esempio, per forzare Spring a produrre una nuova istanza del bean ogni volta che è necessario, si dovrebbe dichiarare l’attributo scope del bean come prototype. Allo stesso modo, se si vuole che Spring restituisca la stessa istanza del bean ogni volta che è necessario, si dovrebbe dichiarare l’attributo scope del bean come singleton.
Lo Spring Framework supporta i seguenti cinque scope, tre dei quali sono disponibili solo se si usa un ApplicationContext web-aware.
Sr.No. | Scope & Descrizione | |
---|---|---|
singleton Questo permette di definire il bean ad una singola istanza per contenitore Spring IoC (default). |
||
2 |
prototipo Questo permette di definire un singolo bean per avere qualsiasi numero di istanze dell’oggetto. |
|
3 |
request Questo permette di definire un bean ad una richiesta HTTP. Valido solo nel contesto di un ApplicationContext Spring web-aware. |
|
4 |
session Questo scope di definizione di un bean ad una sessione HTTP. Valido solo nel contesto di un ApplicationContext Spring web-aware. |
|
5 |
global-session Questo scope definisce un bean ad una sessione globale HTTP. Valido solo nel contesto di un ApplicationContext Spring web-aware. |
In questo capitolo, parleremo dei primi due scope e i tre rimanenti saranno discussi quando parleremo di ApplicationContext Spring web-aware.
Lo scope singleton
Se uno scope è impostato su singleton, il contenitore Spring IoC crea esattamente un’istanza dell’oggetto definito da quella definizione di bean. Questa singola istanza è memorizzata in una cache di tali bean singleton, e tutte le successive richieste e riferimenti per quel bean nominato restituiscono l’oggetto nella cache.
Lo scope di default è sempre singleton. Tuttavia, quando si ha bisogno di una e una sola istanza di un bean, si può impostare la proprietà scope a singleton nel file di configurazione dei 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
Abbiamo un IDE Eclipse funzionante e facciamo i seguenti passi per creare un’applicazione Spring applicazione –
Steps | Description |
---|---|
1 | Creare un progetto con un nome SpringExample e creare un pacchetto com.tutorialspoint sotto la cartella src nel progetto creato. |
2 | Aggiungi le librerie Spring necessarie usando l’opzione Add External JARs come spiegato nel capitolo Spring Hello World Example. |
3 | Crea le classi Java HelloWorld e MainApp sotto il pacchetto com.tutorialspoint. |
4 | Crea il file di configurazione Beans.xml sotto la cartella src. |
5 | Il passo finale è quello di creare il contenuto di tutti i file Java e file di configurazione Bean ed eseguire l’applicazione come spiegato di seguito. |
Ecco il contenuto del file HelloWorld.java –
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 il contenuto del file MainApp.java –
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 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 sorgenti e dei bean, facciamo partire l’applicazione. Se tutto va bene, l’applicazione stamperà il seguente messaggio –
Your Message : I'm object AYour Message : I'm object A
Lo scope prototype
Se lo scope è impostato su prototype, il contenitore Spring IoC crea una nuova istanza dell’oggetto bean ogni volta che viene fatta una richiesta per quel bean specifico. Come regola, usate lo scope prototype per tutti i bean state-full e lo scope singleton per i bean stateless.
Per definire uno scope prototipo, si può impostare la proprietà scope su prototype nel file di configurazione dei 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
Facciamo funzionare l’IDE Eclipse e seguiamo i seguenti passi per creare un’applicazione Spring applicazione –
Steps | Description |
---|---|
1 | Creare un progetto con nome SpringExample e creare un pacchetto com.tutorialspoint sotto la cartella src nel progetto creato. |
2 | Aggiungi le librerie Spring richieste usando l’opzione Add External JARs come spiegato nel capitolo Spring Hello World Example. |
3 | Crea le classi Java HelloWorld e MainApp sotto il pacchetto com.tutorialspoint. |
4 | Crea il file di configurazione Beans.xml sotto la cartella src. |
5 | Il passo finale è quello di creare il contenuto di tutti i file Java e file di configurazione Bean ed eseguire l’applicazione come spiegato di seguito. |
Qui c’è il contenuto del file HelloWorld.java
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 il contenuto del file MainApp.java –
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 il file di configurazione Beans.xml necessario per l’ambito 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>