Le conteneur Spring ne se contente pas d’instancier un bean et de câbler ses dépendances, il fournit également le scope d’une instance. Il existe un support intégré pour six scopes de bean dans Spring Framework. Par exemple, la portée d’un bean peut être singleton, prototype et ainsi de suite. Ce post montre comment définir un bean scope en utilisant l’annotation Spring @Scope.
Supported Spring bean scopes
- Scope singleton- Une seule instance d’objet correspondant à une définition de bean est créée pour chaque conteneur IoC de Spring. Singleton scope est un bean scope par défaut.
- Prototype scope- Une nouvelle instance d’objet est créée chaque fois que le bean est demandé au conteneur Spring.
- Requête scope- Pour chaque requête HTTP, une nouvelle instance de bean est créée. Cette portée du bean Spring n’est valable que dans le contexte d’un ApplicationContext Spring conscient du web.
- Portée de la session- Une seule instance de bean est portée sur le cycle de vie d’une session HTTP. Cette portée n’est valable que dans le contexte d’un Spring ApplicationContext conscient du web.
- Portée de l’application- Portée d’une seule définition de bean sur le cycle de vie d’un ServletContext. Cette portée n’est valable que dans le contexte d’un Spring ApplicationContext conscient du web.
- Portée Websocket- Portée d’une seule définition de bean sur le cycle de vie d’une WebSocket. Cette portée n’est valable que dans le contexte d’un Spring ApplicationContext conscient du web.
Où utiliser l’annotation @Scope
L’annotation @Scope peut être utilisée comme une annotation de niveau type en conjonction avec les annotations @Component et @Configuration. Lorsqu’elle est utilisée comme une annotation de niveau type, @Scope indique le nom d’une portée à utiliser pour les instances du type annoté.
L’annotation @Scope peut également être utilisée comme une annotation de niveau méthode en conjonction avec @Bean. Lorsqu’elle est utilisée comme annotation de niveau méthode, @Scope indique le nom d’un scope à utiliser pour l’instance retournée par la méthode.
L’annotation @Scope avec différents scopes
Dans cette section, nous verrons des extraits de code de l’utilisation de l’annotation @Scope avec différents scopes de bean. Les scopes fournis d’emblée dans Spring peuvent être mentionnés à l’aide des constantes SCOPE_* disponibles dans les interfaces ConfigurableBeanFactory et WebApplicationContext.
@Scope with Singleton bean scope
@Service@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)public class BeanService{ ... ...}
@Scope with Prototype bean scope
@Service@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)public class BeanService{ ... ...}
.
@Scope with Request bean scope
@Service@Scope(WebApplicationContext.SCOPE_REQUEST)public class BeanService{ ... ...}
@Scope with Session bean scope
@Service@Scope(WebApplicationContext.SCOPE_SESSION)public class BeanService{ ... ...}
@Scope with Application bean scope
@Service@Scope(WebApplicationContext.SCOPE_SESSION)public class BeanService{ ... ...}
@Scope avec Application bean scope
@Service@Scope(WebApplicationContext.SCOPE_APPLICATION)public class BeanService{ ... ...}
@Scope avec WebSocket bean scope
@Component@Scope(scopeName = "websocket", proxyMode = ScopedProxyMode.TARGET_CLASS)public class MyBean { ... ...}
Spring @Scope annotation Singleton exemple
Définir un bean avec singleton scope signifie qu’une seule instance de ce bean est créée par le conteneur. Toutes les requêtes pour ce bean retourneront le même objet et toute modification du champ sera reflétée dans toutes les références au bean car toutes les références pointent vers le même objet.
Le scope singleton est le scope par défaut du bean si aucun scope n’est explicitement spécifié.
Nous avons une classe User avec des champs comme firstName, lastName et age. La classe est annotée avec l’annotation @Scope avec la portée spécifiée comme singleton.
La classe de configuration d’application pour spécifier le balayage des composants.
@Configuration@ComponentScan("com.knpcode.springexample")public class AppConfig {}
Maintenant si vous exécutez cet exemple et obtenez deux objets du bean User à partir du conteneur, les deux références d’objet pointeront vers le même bean car la portée est singleton.
Sortie
First Name- RayLast Name- Chandler
Comme vous pouvez le voir firstName et lastName sont définis en utilisant la référence user1, obtenir et imprimer les valeurs de ces champs à partir de la référence user2 donne également les mêmes valeurs.
Anotation Spring @Scope Prototype exemple
Dans la classe User comme montré ci-dessus si le scope est changé en Prototype.
Exécutez maintenant l’exemple et analysez la sortie.
First Name- nullLast Name- null
Les champs sont toujours nuls pour l’instance user2 car une instance séparée est créée maintenant à cause du scope prototype.
Anotation @Scope de Spring avec @Configuration
Dans l’exemple ci-dessus, @Scope est utilisé conjointement avec @Component, voyons un exemple où @Scope est utilisé avec les annotations @Configuration et @Bean.
Voici deux classes dont les instances seront renvoyées par les méthodes annotées avec les méthodes @Bean.
public class MyBean {public void myMethod() {System.out.println("In MyMethod of MyBean class");}}
public class ClassB {public ClassB(){System.out.println("In constructor of ClassB");}}
Classe config
Dans la classe config, @Scope est utilisé à la fois comme annotation au niveau du type et comme annotation au niveau de la méthode. Au niveau du type (en conjonction avec @Configuration) le scope est spécifié comme prototype.
Au niveau de la méthode avec une méthode aucun scope n’est spécifié ce qui signifie que le bean aura le niveau par défaut Singleton. Notez que le scope spécifié au niveau du type n’est pas applicable au niveau de la méthode automatiquement, les méthodes auront leur propre scope. Une autre méthode a le scope Prototype.
Nous pouvons vérifier les scopes du bean en obtenant l’instance BeanDefinition qui a les méthodes isSingleton et isPrototype.
Sortie
AppConfig has prototype scope- trueMyBean has prototype scope- falseMyBean has singleton scope- trueClassB has prototype scope- true
D’après la sortie, vous pouvez voir que le scope du bean AppConfig est prototype, c’est ce que nous avons défini au niveau du type.
Le scope de l’instance MyBean est Singleton qui est attribué par défaut. Le scope pour l’instance ClassB est prototype comme défini au niveau de la méthode dans la classe Config.
- Anotation @PostConstruct et @PreDestroy de Spring
- Anotation @Resource de Spring
- Anotation @Required de Spring
- Anotation @Value de Spring
- Héritage de la définition du Bean de Spring
- Spring. Types de conteneurs IoC – ApplicationContext et BeanFactory
- Spring + JPA (Hibernate) Exemple OneToMany
- Spring Boot et Dependency Injection
C’est tout pour le sujet Spring @Scope Annotation. Si quelque chose manque ou si vous avez quelque chose à partager sur le sujet, veuillez écrire un commentaire.
Vous aimerez peut-être aussi
.