"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Scopes Singleton et Prototype Spring Bean : une exploration détaillée

Scopes Singleton et Prototype Spring Bean : une exploration détaillée

Publié le 2024-11-06
Parcourir:360

Singleton and Prototype Spring Bean Scopes: A Detailed Exploration

Lorsque j'ai commencé à travailler avec Spring, l'un des concepts qui m'a le plus intrigué était l'idée des scopes de bean. Spring fournit diverses portées de bean qui déterminent le cycle de vie des beans créés dans le conteneur Spring. Deux des oscilloscopes les plus couramment utilisés sont Singleton et Prototype. Comprendre ces portées est crucial pour concevoir des applications Spring efficaces et efficientes, alors laissez-moi vous expliquer ce que j'ai appris à leur sujet.

Comprendre les portées des beans Spring

Dans Spring, un bean est un objet instancié, assemblé et géré par le conteneur Spring IoC (Inversion of Control). La portée du bean fait référence au cycle de vie du bean : comment et quand les instances du bean sont créées et combien de temps elles durent.

Spring propose plusieurs scopes de bean, mais les deux sur lesquels je vais me concentrer sont :

  • Portée Singleton
  • Portée du prototype

Chaque étendue a ses cas d'utilisation spécifiques, et choisir le bon peut avoir un impact significatif sur le comportement et les performances de votre application.

La portée Singleton

La portée Singleton est la portée par défaut dans Spring, et c'est celle que j'utilise le plus fréquemment. Lorsqu'un bean est défini avec la portée Singleton, cela signifie que le conteneur Spring ne créera qu'une seule instance de ce bean, et cette instance unique sera partagée dans l'ensemble du contexte de l'application.

Comment ça marche

Lorsque je déclare un bean comme Singleton, Spring crée l'instance du bean la première fois qu'elle est demandée, soit lors du démarrage du contexte d'application, soit lors de sa première référence. Après cela, chaque requête ultérieure pour ce bean renverra la même instance.

Voici un exemple simple :

@Configuration
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyService();
    }
}

Dans cet exemple, myService() est un bean Singleton. Chaque fois que je demande un bean MyService au contexte Spring, j'obtiens la même instance.

Cas d'utilisation des beans Singleton

J'ai trouvé que la portée Singleton est idéale pour les beans sans état, ceux qui ne contiennent aucune information spécifique au client. Les exemples incluent :

  • Classes de service : en règle générale, ces classes contiennent une logique métier qui peut être partagée dans l'application sans avoir besoin d'instances distinctes.
  • Classes DAO : étant donné qu'elles interagissent généralement avec la base de données et ne maintiennent pas d'état spécifique au client, une seule instance suffit.

Avantages et considérations

Le principal avantage des beans Singleton est l'efficacité de la mémoire. En réutilisant une seule instance, l'application consomme moins de mémoire et la surcharge liée à la création et à la destruction d'objets est minimisée. Cependant, il est important d’être prudent avec les haricots Singleton qui conservent leur état. Si un bean Singleton détient par inadvertance un état (par exemple, des variables d'instance), cet état peut être partagé entre plusieurs clients, entraînant des incohérences potentielles des données.

La portée du prototype

Contrairement à Singleton, la portée Prototype crée une nouvelle instance de bean chaque fois que le bean est demandé au conteneur Spring. Lorsque j'ai appris cela, il était clair que les beans Prototype étaient utiles dans les scénarios où j'avais besoin d'une nouvelle instance pour chaque utilisation.

Comment ça marche

Lorsqu'un bean est défini avec la portée Prototype, Spring renverra une nouvelle instance à chaque fois que le bean est demandé. Voici comment je pourrais définir un bean Prototype :

@Configuration
public class AppConfig {
    @Bean
    @Scope("prototype")
    public MyService myService() {
        return new MyService();
    }
}

Dans cet exemple, chaque fois que je demande le bean MyService au contexte Spring, Spring créera une nouvelle instance de MyService.

Cas d'utilisation des beans prototypes

Les beans prototypes sont particulièrement utiles lorsqu'il s'agit de beans avec état, ceux qui maintiennent une sorte d'état spécifique au client ou nécessitent une configuration unique pour chaque utilisation. Voici quelques cas d'utilisation typiques :

  • Objets de commande : Si j'implémente un modèle tel que Command, où chaque commande est exécutée séparément et conserve son propre état, un bean Prototype est le bon choix.
  • Beans de portée de session ou de demande : dans les applications Web, les beans spécifiques à une session ou à une demande utilisateur peuvent être définis en tant que prototype pour garantir qu'une nouvelle instance est créée pour chaque utilisateur ou demande.

Avantages et considérations

Le principal avantage de l'utilisation des beans Prototype est la flexibilité qu'il offre dans la création de nouvelles instances. Ceci est particulièrement utile lorsqu'il s'agit d'objets avec état. Cependant, il existe un compromis en termes de performances et d’utilisation des ressources. Puisqu’une nouvelle instance est créée à chaque fois, cela peut entraîner une consommation de mémoire plus élevée et un garbage collection plus fréquent. De plus, contrairement aux beans Singleton, Spring ne gère pas le cycle de vie des beans Prototype au-delà de la création, je dois donc gérer manuellement la destruction et le nettoyage de ces beans.

Singleton vs prototype : choisir la bonne portée

L'une des décisions clés auxquelles je suis confronté lors de la conception d'une application Spring est de choisir entre la portée Singleton et Prototype. Voici un résumé des facteurs que je prends en compte :

  • Statefulness : si le bean est apatride, Singleton est généralement le meilleur choix. Pour les beans avec état, Prototype est plus approprié.
  • Gestion des ressources : les beans Singleton sont plus efficaces en termes de mémoire puisqu'une seule instance est conservée. Les beans prototypes, tout en offrant plus de flexibilité, consomment plus de ressources.
  • Gestion du cycle de vie : les beans Singleton sont gérés par le conteneur Spring tout au long de leur cycle de vie. En revanche, je dois gérer le cycle de vie complet des beans Prototype.

Exemple pratique

Permettez-moi de vous proposer un scénario pratique qui pourrait aider à clarifier quand utiliser chaque étendue. Supposons que je crée une application d'achat en ligne.

  • Service de panier d'achat : ce service serait généralement sans état et serait un bon candidat pour un bean Singleton. Il n'est pas nécessaire de créer une nouvelle instance à chaque fois et le même service peut gérer plusieurs requêtes.
  • Traitement des commandes : d'un autre côté, l'objet Order qui représente la commande d'un client serait avec état, contenant des détails spécifiques à cette commande. Par conséquent, il doit s'agir d'un bean Prototype afin que chaque commande soit gérée par une instance distincte de la classe Order.

Scopes de mixage : un mot d'avertissement

Une chose que j'ai apprise à mes dépens, c'est que mélanger des beans Singleton et Prototype peut entraîner des problèmes inattendus. Par exemple, l'injection d'un bean de portée prototype dans un bean Singleton peut avoir pour résultat que le bean Singleton utilise toujours la même instance du bean Prototype. Pour éviter cela, j'injecte généralement un fournisseur ou j'utilise l'annotation @Lookup pour garantir qu'une nouvelle instance du bean Prototype est créée à chaque fois que cela est nécessaire.

@Service
public class SingletonService {

    @Autowired
    private Provider myPrototypeServiceProvider;

    public void usePrototypeService() {
        MyPrototypeService prototypeService = myPrototypeServiceProvider.get();
        prototypeService.execute();
    }
}

Dans cet exemple, myPrototypeServiceProvider.get() garantit qu'une nouvelle instance de MyPrototypeService est créée à chaque fois qu'elle est appelée dans le bean Singleton.

Au revoir !

Comprendre les nuances des scopes de bean Singleton et Prototype au Spring a été essentiel dans mon parcours en tant que développeur. Les deux scopes offrent des avantages distincts en fonction du cas d'utilisation, et choisir le bon peut avoir un impact significatif sur les performances et la conception d'une application.

D'après mon expérience, Singleton est la solution idéale pour la plupart des beans en raison de son efficacité et de sa simplicité, tandis que Prototype est réservé aux cas particuliers où j'ai besoin d'une nouvelle instance à chaque fois. En examinant attentivement l'état de mes beans et la manière dont ils sont utilisés dans l'application, je peux prendre des décisions éclairées qui conduisent à des applications Spring meilleures et plus maintenables.

Déclaration de sortie Cet article est reproduit sur : https://dev.to/isaactony/singleton-and-prototype-spring-bean-scopes-a-detailed-exploration-1gpl?1 En cas de violation, veuillez contacter [email protected] pour le supprimer
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3