Sauberer Weg, um neue Instanz eines autowired Feld, das Vorbild in der Natur
Stand ich vor diesem Problem, während Sie versuchen autowire eine runnable-Klasse und der Erstellung von verschiedenen Instanzen in verschiedenen call und halten Sie Sie in einem array.
xml-Konfiguration ist :
<bean name="threadName" Class="ABC" scope="prototype" />
In meinem code, ich versuche so etwas wie dieses:
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();
}
}
}
Lassen ABC
eine Klasse sein, die Thread/Runnable/Callable
.
In dieser Weise, es wirft java.lang.IllegalThreadStateException
.
Aber, es funktioniert gut, wenn ich ABC tName =appContext.getBean("threadName",ABC.class);
Warum ist es passiert?
Nicht bekommen wir eine neue Instanz, während versucht, ein Objekt von getMethod?
Sie brauchen keine getter. verwenden Sie einfach diese.threadName.someFinction();
meinst du, diese.threadName wird immer eine neue Instanz? genau so, wie appContext.getBean("name",Klasse)?
meinst du, diese.threadName wird immer eine neue Instanz? genau so, wie appContext.getBean("name",Klasse)?
InformationsquelleAutor instanceOfObject | 2012-04-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist viel besser üben, wenn Sie brauchen, um zu erstellen Runnable/Callable und injizieren es in der Datei ApplicationContext es heißt look-up-Methode:
Wir betrachten, dass alle Runnable/Callable-Klassen sind @Prototyp und @Lazy
Nun müssen Sie Erstellen Look-up-Methode factory:
Lassen Sie uns nun TaskFactory Implementierung selbst, die abstrakte Klasse eine abstrakte Methode :
Hier kommt die Magie:
Jedes mal, wenn Sie anrufen createTask () - Methode taskFactory singleton-Objekt. Sie erhalten komplett neue Instanz Ihrer Prototyp-Objekt.
P. S: vergessen Sie nicht, fügen Sie
aktivieren Anmerkungen richtig.
hoffe, es Hilft.
InformationsquelleAutor danny.lesnik
Nein, Sie nicht bekommen, ein neues Objekt, nur durch den Zugriff auf ein Feld, das einen Verweis auf ein scoped bean als Prototype. Spring nicht über eine Möglichkeit, ersetzen Sie die Instanz-Ebene Referenz eine neue Referenz basiert nur auf Feld zugreifen. Ist es gesetzt, einmal durch das autowiring und dann ist es nur eine Referenz zu einem Objekt. Wenn Sie wollen, dass es tatsächlich eine neue erstellen, die Sie verwenden müssen getBean, wie Sie beobachtet.
Können Sie sagen, Spring überschreiben Ihre get-Methode, und ersetzen Sie es mit einem "getBean' mit der Methode der Einspritzung, um die Spring-Abhängigkeiten aus Ihrem bean:
Ja, Sie können, verwenden Sie die Methode der Injektion zu haben Feder generieren der bean in Reaktion auf die getter:
InformationsquelleAutor Affe