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.
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 :
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 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.
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.
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 :
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.
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.
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.
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 :
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.
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 :
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.
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 ProvidermyPrototypeServiceProvider; 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.
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.
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