Maison > Java > javaDidacticiel > le corps du texte

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

WBOY
Libérer: 2024-09-01 08:30:32
original
814 Les gens l'ont consulté

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 champs d'application 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

Au 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 portées de bean, mais les deux sur lesquelles je vais me concentrer sont :

  • Portée Singleton
  • Portée du prototype

Chaque étendue a ses cas d'utilisation spécifiques, et choisir la bonne 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 demande 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();
    }
}
Copier après la connexion

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 : généralement, ces classes contiennent une logique métier qui peut être partagée dans l'application sans avoir besoin d'instances distinctes.
  • Classes DAO : Comme 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();
    }
}
Copier après la connexion

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. Certains cas d'utilisation typiques incluent :

  • Command Objects: If I’m implementing a pattern like Command, where each command is executed separately and maintains its own state, a Prototype bean is the right choice.
  • Session or Request Scoped Beans: In web applications, beans that are specific to a user session or request can be defined as Prototype to ensure a new instance is created for each user or request.

Benefits and Considerations

The primary advantage of using Prototype beans is the flexibility it offers in creating new instances. This is particularly useful when dealing with stateful objects. However, there’s a trade-off in terms of performance and resource usage. Since a new instance is created every time, it can lead to higher memory consumption and more frequent garbage collection. Moreover, unlike Singleton beans, Spring does not manage the lifecycle of Prototype beans beyond creation, so I have to handle the destruction and cleanup of these beans manually.

Singleton vs. Prototype: Choosing the Right Scope

One of the key decisions I face when designing a Spring application is choosing between Singleton and Prototype scope. Here’s a summary of the factors I consider:

  • Statefulness: If the bean is stateless, Singleton is usually the best choice. For stateful beans, Prototype is more appropriate.
  • Resource Management: Singleton beans are more memory efficient since only one instance is maintained. Prototype beans, while offering more flexibility, consume more resources.
  • Lifecycle Management: Singleton beans are managed by the Spring container throughout their lifecycle. In contrast, I must manage the full lifecycle of Prototype beans.

Practical Example

Let me provide a practical scenario that might help clarify when to use each scope. Suppose I’m building an online shopping application.

  • Shopping Cart Service: This service would typically be stateless and would be a good candidate for a Singleton bean. There’s no need to create a new instance every time, and the same service can handle multiple requests.
  • Order Processing: On the other hand, the Order object that represents a customer’s order would be stateful, holding details specific to that order. Therefore, it should be a Prototype bean so that each order is handled by a separate instance of the Order class.

Mixing Scopes: A Word of Caution

One thing I’ve learned the hard way is that mixing Singleton and Prototype beans can lead to unexpected issues. For example, injecting a Prototype-scoped bean into a Singleton bean can result in the Singleton bean always using the same instance of the Prototype bean. To avoid this, I usually inject a Provider or use the @Lookup annotation to ensure a new instance of the Prototype bean is created every time it is needed.

@Service
public class SingletonService {

    @Autowired
    private Provider<MyPrototypeService> myPrototypeServiceProvider;

    public void usePrototypeService() {
        MyPrototypeService prototypeService = myPrototypeServiceProvider.get();
        prototypeService.execute();
    }
}
Copier après la connexion

In this example, myPrototypeServiceProvider.get() ensures that a new instance of MyPrototypeService is created every time it is called within the Singleton bean.

GoodBye !

Understanding the nuances of Singleton and Prototype bean scopes in Spring has been critical in my journey as a developer. Both scopes offer distinct advantages depending on the use case, and choosing the right one can significantly impact the performance and design of an application.

In my experience, Singleton is the go-to scope for most beans due to its efficiency and simplicity, while Prototype is reserved for those special cases where I need a fresh instance every time. By carefully considering the statefulness of my beans and how they are used within the application, I can make informed decisions that lead to better, more maintainable Spring applications.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!