Le moyen le plus propre pour obtenir une nouvelle instance d'un autocâblés champ qui est le prototype dans la nature
J'ai fait face à ce problème, tout en essayant de autowire une classe runnable et la création de différentes instances dans les différents appels et de les garder dans un tableau.
xml de configuration est :
<bean name="threadName" Class="ABC" scope="prototype" />
Dans mon code, je suis en train d'essayer quelque chose comme ceci:
public class ThreadHandler{
@Autowired
private ABC threadName;
//getter
ABC getThreadName(){
return threadName;
}
public void someFunction(){
List<ABC> abc = new ArrayList(ABC>();
for (int i=0;i<SOME_CONST;i++){
ABC tName = getThreadName();
abc.add(tName);
tName.start();
}
}
}
Laisser ABC
être une classe qui est Thread/Runnable/Callable
.
De cette façon, il jette java.lang.IllegalThreadStateException
.
Mais, il fonctionne très bien, si j'utilise ABC tName =appContext.getBean("threadName",ABC.class);
Pourquoi se produit-il?
Nous n'obtenons pas une nouvelle instance, tout en essayant d'obtenir un objet de getMethod?
- Vous n'avez pas besoin de lecture. il suffit d'utiliser cette.threadName.someFinction();
- tu veux dire, c'.threadName donnera toujours une nouvelle instance? exactement de la même façon appContext.getBean("nom",de classe) n'?
Vous devez vous connecter pour publier un commentaire.
Est bien meilleure pratique lorsque vous avez besoin pour créer des Exécutables/Rachetables et à l'injecter dans applicationContext il appelle chercher méthode:
Considérons que tous les Exécutables/Appelable classes sont @Prototype et @Lazy
Maintenant, vous avez besoin pour Créer Look méthode d'usine:
Maintenant, nous allons mettre en œuvre TaskFactory lui-même qui est une classe abstraite et ont une méthode abstraite :
Ici vient la magie:
Chaque fois que vous appelez createTask() la méthode de taskFactory objet singleton. vous recevrez complètement nouvelle instance de votre prototype de l'objet.
P. S: n'oubliez pas d'ajouter
pour activer les Annotations correctement.
espère que cela Aide.
Non, vous n'obtenez pas un nouvel objet, tout en accédant à un champ qui contient une référence à un haricot dont l'étendue en tant que Prototype. Le printemps n'a pas de remplacer votre niveau de l'instance de référence avec une nouvelle référence, basé uniquement sur le terrain. Il est défini une fois par l'permettra à l'autowiring et puis c'est juste une référence à un objet. Si vous voulez vraiment créer un nouveau, vous devez utiliser getBean que vous avez observé.
Vous pouvez dire de Printemps pour remplacer votre méthode get et de le remplacer par un "getBean' l'aide de la méthode d'injection, pour obtenir le Printemps des dépendances de votre bean: