Méthode de destruction de haricots de printemps, singleton et prototypes
Je suis nouveau sur le framework spring, a commencé avec quelques tutoriels pour apprendre.
J'ai les fichiers suivants,
# MainProgram.java
package test.spring;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainProgram {
public static void main(String[] args) {
AbstractApplicationContext context =
new ClassPathXmlApplicationContext("Bean.xml");
HelloSpring obj = (HelloSpring) context.getBean("helloSpring");
obj.setMessage("My message");
obj.getMessage();
context.registerShutdownHook();
}
}
# HelloSpring.java
package test.spring;
public class HelloSpring {
private String message;
public void setMessage(String message){
this.message = message;
System.out.println("Inside setMessage");
}
public void getMessage(){
System.out.println("Your Message : " + this.message);
}
public void xmlInit() {
System.out.println("xml configured initialize");
}
public void xmlDestroy() {
System.out.println("xml configured destroy");
}
}
# Bean.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="helloSpring" class="test.spring.HelloSpring"
scope="prototype" init-method="xmlInit" destroy-method="xmlDestroy">
</bean>
</beans>
Quand je prends scope="singleton"
mon résultat est :
xml configured initialize
Inside setMessage
Your Message : My message
xml configured destroy
Quand je prends scope="prototype"
mon résultat est :
xml configured initialize
Inside setMessage
Your Message : My message
xmlDestroy()
méthode est appelée avec singleton
portée bean, mais pas avec prototype
de bien vouloir m'aider pour la suite ,
Est-ce correct? si oui, quelles seraient les raisons possibles?
Aussi j'ai quelques demandes,
quelle est la différence ou le rapport entre
ApplicationContext , AbstractApplicationContext and ClassPathXmlApplicationContext
source d'informationauteur Nikhil Rupanawar
Vous devez vous connecter pour publier un commentaire.
xmlDestroy()
méthode est appelée avec singleton champ de haricots, mais pas avec le prototype parce quePrintemps n'a pas à gérer le cycle de vie complet d'un prototype de haricot: le conteneur instancie, configure, décore et sinon assemble un prototype de l'objet, le remet au client, puis n'a plus connaissance de ce prototype de l'instance. Pour libérer les ressources essayer de mettre en œuvre une coutume bean post-processeur.
Contrairement à singleton haricots où le printemps conteneur gère le cycle de vie complet
Vous pouvez avoir un coup d'oeil à cette base tutoriel pour les différences entre les différents contextes
Reportez-vous la documentation
Un singleton bean signifie qu'il y a exactement une instance de bean dans le contexte de l'application. Cela signifie que si vous faites quelque chose comme cela:
Vous verrez "Mon message" dans la sortie de la console à deux reprises.
Pour prototype haricots à chaque fois que vous essayez d'obtenir un de ces à partir du contexte de l'application, vous obtiendrez une nouvelle instance donc, si vous exécutez le code ci-dessus à nouveau la deuxième sortie de la console sera "null".
Comme il n'est pas nécessaire pour le conteneur pour appeler une méthode destroy pour un prototype de haricot, il ne fait pas et le comportement est correct.
La différence entre ces catégories sont qu'ils sont une interface, une classe abstraite et une classe concrète, respectivement, pour mieux comprendre ce sujet concepts je suggère la lecture de l'officiel de la documentation d'oracle pour java ici Oracle Tutoriels Java.
C'est le comportement attendu. Il n'existe aucun moyen pour le Printemps de savoir quand vous avez fini d'utiliser un prototype champ de haricots, de sorte bean destruction n'est pas géré par le Printemps pour prototype l'étendue des haricots. À partir de la documentation:
Voir le Le printemps de la documentation pour plus d'informations.
En ce qui concerne
ApplicationContext
s, vous pouvez choisir celui qui est le mieux adapté à votre application. Cela dépend si vous souhaitez utiliser des fichiers XML ou annotation haricot de configuration, et si oui ou non vous êtes en cours d'exécution dans un conteneur de servlet, par exemple.ApplicationContext
lui-même est l'interface à la racine du type de hiérarchie.votre application peut demander de nouvelles instances de prototype haricots toutes les 10 millisecondes, faire quelque chose avec le haricot, et puis laisser aller hors de portée. Si le Printemps venait de détruire() lorsque l'application s'arrête, il aurait à conserver une référence pour tous les créé un prototype de haricots, les empêchant d'être récupérées, et provoquant ainsi une fuite de mémoire.
J'ai aussi essayé d'obtenir un événement de destruction de haricot dont la portée est "prototype".
Alors j'ai lu toutes les réponses ci-dessus et essayez par leurs réponses.
Au résultat, je l'ai portée qu'il n'y a aucun moyen de détecter les détruire encore de prototype bean.
Bien que l'initialisation du cycle de vie des méthodes de rappel sont appelés sur tous les objets indépendamment de leur portée, dans le cas des prototypes, configuré destruction du cycle de vie des rappels ne sont pas appelées.
voir ici (https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/beans.html#beans-factory-scopes-prototype)
Veuillez vérifier votre type de portée dans votre fichier de configuration spring.
Si scope="prototype", puis changer à portée="singleton"