Exemple de champs de haricots printaniers

Exemple de portée de haricot de printemps

Au printemps, la portée du bean est utilisée pour décider quel type d'instance de bean doit être renvoyé du conteneur Spring à l'appelant.

5 types de portées de haricots pris en charge:

  1. singleton - Retourne une seule instance de bean par conteneur Spring IoC

  2. prototype - Renvoie une nouvelle instance de bean à chaque fois que demandé

  3. request - Renvoie une seule instance de bean par requête HTTP. *

  4. session - Renvoie une seule instance de bean par session HTTP. *

  5. globalSession - Renvoie une seule instance de bean par session HTTP globale. *

Dans la plupart des cas, vous ne pouvez traiter que la portée principale de Spring - singleton et prototype, et la portée par défaut est singleton.

P.S * means only valid in the context of a web-aware Spring ApplicationContext

Singleton vs Prototype

Voici un exemple pour vous montrer quelle est la différence entre la portée du bean:singleton etprototype.

package com.example.customer.services;

public class CustomerService
{
    String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

1. Exemple de singleton

Si aucune étendue de bean n'est spécifiée dans le fichier de configuration du bean, la valeur par défaut est singleton.



       

Exécuter

package com.example.common;

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

import com.example.customer.services.CustomerService;

public class App
{
    public static void main( String[] args )
    {
        ApplicationContext context =
         new ClassPathXmlApplicationContext(new String[] {"Spring-Customer.xml"});

        CustomerService custA = (CustomerService)context.getBean("customerService");
        custA.setMessage("Message by custA");
        System.out.println("Message : " + custA.getMessage());

        //retrieve it again
        CustomerService custB = (CustomerService)context.getBean("customerService");
        System.out.println("Message : " + custB.getMessage());
    }
}

Sortie

Message : Message by custA
Message : Message by custA

Étant donné que le bean «customerService» est de portée singleton, la deuxième récupération par «custB» affichera également le message défini par «custA», même s'il est récupéré par une nouvelle méthode getBean (). En singleton, une seule instance par conteneur Spring IoC, quel que soit le nombre de fois où vous le récupérez avec getBean (), il renvoie toujours la même instance.

2. Exemple de prototype

Si vous voulez une nouvelle instance de bean «customerService», chaque fois que vous l'appelez, utilisez plutôt le prototype.



   

Lancez-le à nouveau

Message : Message by custA
Message : null

Dans la portée du prototype, vous aurez une nouvelle instance pour chaque méthodegetBean() appelée.

3. Annotation des étendues de bean

Vous pouvez également utiliser des annotations pour définir la portée de votre bean.

package com.example.customer.services;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

@Service
@Scope("prototype")
public class CustomerService
{
    String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

Activer l'analyse automatique des composants



       

Télécharger le code source

Téléchargez-le -Spring-Bean-Scopes-Example.zip (7 Ko)