[Java] Spring DI ④ --Gestion du cycle de vie
Qu'est-ce que la gestion du cycle de vie DI?
- DI vous permet de définir la portée d'une instance
- La portée est définie avec l'annotation @Scope
- Par défaut, il s'agit d'un singleton et une seule instance peut être créée.
- Notez si le champ a des instances avec des portées différentes
Qu'est-ce que la gestion du cycle de vie?
- Gérer la création (nouvelle) et la destruction d'instance
- Pour détruire l'instance nouvellement créée, mettez null dans la variable pour libérer la mémoire
- Pourtant! ** Les champs avec @Autowired seront automatiquement gérés par Spring sans être nuls! ** **
- De plus, lors de l'utilisation du servlet ** Spring enregistrera également la portée de l'instance! ** (Servlet est une fonction pour enregistrer une instance dans la portée Session ou la portée Requête)
- Remarque: assurez-vous de savoir quand l'instance sera détruite
Qu'est-ce qu'une portée
- Date d'expiration de l'instance
- Exemple: les variables déclarées dans l'instruction if en tant que variables Java locales ne peuvent pas être utilisées en dehors de l'instruction if car la portée est à l'intérieur de l'instruction if.
- Portée de la session
- Date d'expiration de la connexion de l'utilisateur à la déconnexion
- Champ d'application de la demande
- Une requête HTTP expire
- Exemple: la portée de la demande va de l'écran d'enregistrement de l'utilisateur à l'écran de résultat d'enregistrement
Comment utiliser Scope
- Spécifiez la portée à enregistrer dans l'annotation avec l'annotation @Scope comme indiqué ci-dessous.
- En plus de @Component, l'annotation @Scope peut être utilisée pour @Bean, @Controller, etc.
- ** Facile à créer et à détruire des instances **
@Component
@Scope("prototype")
public class SampleComponent{
}
Portée spécifiée par @Scope
- singleton
- Configuration par défaut
- Créez une seule instance au démarrage de Spring,
- Partager et utiliser une instance après la création
- prototype
- Chaque fois que vous obtenez un bean, une instance est créée
- session
- Une instance est créée pour chaque session HTTP. Utilisé uniquement pour les applications Web
- request
- Une instance est créée pour chaque requête HTTP. Utilisé uniquement pour les applications Web
- globalSession
- Généré pour chaque session Grobal dans l'environnement de portlet
- Utilisé uniquement pour les applications Web prenant en charge les portlets
- application
- Une instance est créée pour chaque contexte du servlet. Uniquement disponible pour les applications Web.
Remarque 1: la valeur par défaut est singleton
- Sans @Scope, l'instance est créée avec singleton
- Avec singleton, une seule instance de l'objet peut être créée, et il n'est même pas possible de créer deux instances ou plus.
-
- Singleton est généralement suffisant pour la portée de @Controller, @Service, @Repository
Remarque 2: si le champ a des instances avec des portées différentes
- Si une instance de portée singleton a un objet de portée prototype, ** Bean avec portée prototype (ci-après appelé PrototypeComponent) devient portée singleton **
//Devient une portée singleton
@Component
@Scope("prototype")
public class PrototypeComponent{
}
@Component
public class SingletonComponent{
@Autowired
private PrototypeComponent component;
}