Frühling @autowired nicht dazu gedacht, für nicht-singleton-Container?
Ich habe eine MyTask
- Klasse, die implementiert Runnable
und es kann viele solche Objekte instanziiert werden, in jedem gegebenen moment. Es gibt bestimmte Eigenschaften, die ich möchte autowire in MyTask
Klasse.
Aber ich denke , wenn ich daneben MyTask
mit @Component
dann wird es werden wie ein spring-managed-singleton-richtig? Das ist nicht das, was ich will, ich brauche viele unabhängige Instanzen dieser Klasse werden von einem TaskExecutor.
Also meine Frage(N):
- a) Bin ich grundlegend falsch in meinem Verständnis der
@Component
annotation? Tut Sie es NICHT machenMyTask
in eine spring-managed-singleton? - b) gibt es eine andere Anmerkung, die ich verwenden soll, so dass der Frühling erkennt
@Autowired
und injiziert Eigenschaft? - c) Ist der Frühling autowiring nicht dazu gedacht, für nicht-singleton-Container-Klassen, wie
MyTask
?
Update # 1 - Diese funktionieren nicht:
public class MyTask implements Runnable { //I want this class to be non-singleton
@Autowired
public SomeSpecialSpringConfiguredConnectionClass blah; //this is the singleton bean that should be injected
@Override
public void run() {
//BLAH IS NULL, this shouldn't be NULL, that is not what I want
//which makes sense considering Spring never knew it had to work
//on this class
}
}
@Component
public class MyTask implements Runnable { //I want this class to be non-singleton
@Autowired
public SomeSpecialSpringConfiguredConnectionClass blah; //this is the singleton bean that should be injected
@Override
public void run() {
//this works BUT now MyTask is singleton :(
}
}
@Component
@Scope("prototype")
public class MyTask implements Runnable { //I want this class to be non-singleton
@Autowired
public SomeSpecialSpringConfiguredConnectionClass blah; //this is the singleton bean that should be injected
@Override
public void run() {
//BLAH IS NULL, again ... this shouldn't be NULL, that is not what I want
}
}
Update # 2 - Während der Wartezeit für einige weitere Vorschläge auf, wie es zu tun den einfachen Weg, ich bin auf der Suche in: Using AspectJ to dependency inject domain objects with Spring
als alternative.
Danke! Aber das funktioniert nicht für das, was ich verlange, ich versuchte es bereits.
wie sind Sie gehen zu verwenden, MyTask? und was meinst du mit " funktioniert nicht mit @Scope("Prototyp")?
Nicht sicher, warum, dass der Umfang nicht funktioniert. Es sei denn vielleicht sind Sie dependency Injektion MyTask in ein weiteres singleton, in welchem Fall Sie brauchen, um sich in die Methode der Injektion oder AOP. Werfen Sie einen Blick auf stackoverflow.com/questions/829463/...
erarbeitet im update#1 zu erklären, was ich meine
doesn't work with @Scope("prototype")
InformationsquelleAutor pulkitsinghal | 2014-01-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
erste, Bohnen deklariert mit @Component und nahm von Frühling Komponente scan wird ein spring-verwaltete singleton standardmäßig.
Ich habe keine Ahnung, wie Sie MyTask, aber es ist overkilled zu verwenden AspectJ in Ihrer situation, und es macht nicht viel Sinn zu erklären, MyTask als spring-managed bean. ein anderer Weg, dies zu tun werden:
definieren MyTask als einfachen java-Klasse und fügen Sie einen Konstruktor zum initialisieren der Abhängigkeit
blah
autowire bla in denen Sie
MyTask
und instanziieren einer MyTask Objekt jedes mal, wenn Sie wollen, um eine Aufgabe wie folgt:Is Spring @autowired not meant for non-singleton containers?
Ich bin der Annahme, dass diese Antwort, weil es im Grunde gesagt:
No, autowired is not meant for non-singleton containers
zu meiner Frage ... wie hab ich meinen code, den ich verwendetAspectJ to dependency inject domain objects with Spring
als alternative.InformationsquelleAutor Septem
Der @Component-annotation würde es Ihnen ermöglichen, für auto detetion, während classpath-Scans über das context:component-scan
Das ist, was es tut. es gibt eine feine Linie zwischen @Service und @ - Komponente, und in diesem Fall ist es nicht auf irgendwie.
Frühjahr autowiring getan werden kann, für Prototypen sowie singleton-Bereiche. Im Fall des Prototypen Umfang obwohl der lifecycle-callbacks für die Zerstörung der bean nicht aufgerufen.
Es ist sehr gut erklärt auf die Spring-Dokumentation Seite.
http://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html
Ich sehe nicht einen Grund, warum was auch immer erwähnt sollte man nicht arbeiten.
Er ist ein funktionierendes Beispiel, was ich versuchte zu tun, um das besser zu erklären.
Dies ist der Ausgangspunkt der app.
Hier ist Ihre Klasse myTask
Beiden anderen Klassen zu zeigen, wie der Prototyp Umfang arbeitet
Einen BeanPostprocessor, die Ihnen zeigen, wie Sie die Objekte werden immer erstellt
Ihre SomeSpringConfig Klasse
Wenn Sie Sie dieses Beispiel ausführen, werden Sie feststellen, dass die Ausgabe auf der Konsole ist
Wenn Sie bemerken, carefulyy es gibt 2 Objekte myTask mit unterschiedlichen hashcodes.
Wenn Sie den Bereich ändern, der myTask "Singleton" - hier wäre der Ausgang.
In diesem Fall wird ein Objekt erstellt, für "myTask"
Funktioniert diese Hilfe?
someSpringObject
imMyTask
'srun()
Methode ... sehen Sie, dass der null-Wert für beide Prototyp-Objekte ... und das ist es, was ich will, zu lösen.InformationsquelleAutor Hrishikesh
In der Regel hinzufügen @Scope("Prototyp") sollte nicht dazu führen, null Fehler für autowired bla bean,sollten Sie überprüfen, wie Sie instanziieren MyTask bean.
Ich denke, das problem ist, dass Sie manuell erstellen MyTask wie:
und deshalb geht es aus der Feder kontrollieren, die ist, warum seine Abhängigkeit, bla Bohne, null ist , anstelle der manuellen Instanziierung, müssen Sie autowire Sie es und lassen Sie den Frühling kümmert sich um die Abhängigkeiten dann bla willnot null sein.
Aber dann gibt es ein weiteres Problem. Autowiring eine prototype-bean, MyTask, in einem anderen singleton-Objekt falsch ist. Spring-container erstellt eine singleton-bean nur einmal, und so nur setzt Sie die prototype-bean einmal, und dies bewirkt, dass der Prototyp-Rahmen, nicht zu arbeiten.Wie unten Myactivity ist ein singleton, die autowires MyTask, ich habe auch einen Konstruktor für MyTask, etwas zu drucken, sobald eine neue Instanz von MyTask angelegt wird. Im nachstehenden Fall geht es druckt nur einmal, daher ein Prototyp ist, funktioniert nicht.
Basierend auf Spring AOP Gültigkeitsbereich proxies ich geändert @Scope("Prototyp") @Scope(proxyMode = ScopedProxyMode.TARGET_CLASS, Wert = "Prototyp")
so scoped-proxy fügt eine neue Instanz von MyTask jeder Zeit singleton MyActivity bean aufgerufen wird.
und jetzt der Prototyp ist in Ordnung, und das war das Ergebnis gedruckt in der Konsole:
InformationsquelleAutor ShayneR
Statt @Autowire die Verwendung von @Inject und sehen Sie die Magie.
Ich habe die gleiche situation, wo in einer Validator-Klasse ist die Java-Singleton-Klasse und nicht in spring-scoped bean. Ich muss Spritzen, ein LF-Client-spring-bean zur Verfügung gestellt von einem anderen team. Also @Autowire hat nicht funktioniert, aber @Inject funktioniert hat.
InformationsquelleAutor Yoga Gowda