Kann @Inject optional sein, im JSR 330 (wie @Autowire(required=false)?
Spring @Autowire
kann so konfiguriert werden, dass der Frühling wird nicht werfen einen Fehler, wenn kein passender autowire Kandidaten sind gefunden: @Autowire(required=false)
Gibt es ein äquivalent JSR-330-annotation? @Inject
schlägt immer fehl, wenn es keine passenden Kandidaten. Gibt es eine Möglichkeit, die ich nutzen kann @Inject
aber nicht die Rahmenbedingungen scheitern, wenn keine passenden Typen zu finden sind? Ich habe nicht in der Lage zu finden, keine Dokumentation in diesem Umfang.
- Nicht wirklich eine gute Idee: Sie wählen, um es nicht in CDI, um sicherzustellen, dass alle Abhängigkeiten vorhanden sind. Sollte man wirklich einen null-check auf eine Abhängigkeit? Scheint wie ein Architektur problem, und eine Lösung könnte sein, die Spritzen eine Schnittstelle, welche eine no-op-Umsetzung. Null, falls nicht gefunden, ist wirklich schlechtes design: ist es nicht auf Zweck oder durch einen Programmier-Fehler???
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein... es gibt keine Entsprechung für optionale JSR 330... wenn Sie wollen, verwenden Sie optional Injektion, dann haben Sie zu halten mit den framework-spezifischen
@Autowired
annotation@Optional
Funktion?Können Sie
java.util.Optional
.Wenn Sie mit Java 8 und Ihre Frühjahr version ist
4.1
oder höher (siehe hier), stattKönnen Sie einfach
java.util.Optional
Klasse, kam mit Java 8. Verwenden Sie es wie:Diese Instanz wird nie
null
, und Sie können es verwenden, wie:Diese Weise können Sie auch constructor injection, mit einigen Bohnen erforderlich, und einige Bohnen, optional, bietet große Flexibilität.
Achtung: Leider ist der Frühling nicht unterstützt Guave's
com.google.common.base.Optional
(siehe hier), so funktioniert diese Methode nur, wenn Sie Java 8 (oder höher).required
obwohl?java.util.Optional
als ein Feld, wird davon abgeraten im Allgemeinen. Ist es nicht sogar implementieren dieSerializable
- Schnittstelle.Instanz Injektion wird oft übersehen. Es fügt große Flexibilität. Prüfen Sie die Verfügbarkeit der Abhängigkeit vor, um es zu erhalten. Ein unzufriedener bekommen, wird eine exception zu werfen, der teuer ist. Verwendung:
Schränken Sie die Injektion Kandidaten als normal:
javax.enterprise.inject.Instance
Klasse. Aber was JSR/pkg-ist es Teil? Es scheint nicht zu sein, Teil von JSR-330. Ist das eine JEE6-spezifische Sache?Es ist möglich, erstellen Sie eine optionale Einspritzung Punkt!
Müssen Sie verwenden Injektion lookup dokumentiert, wie in http://docs.jboss.org/weld/reference/latest/en-US/html/injection.html#lookup
Oder auch alle Instanzen eines Typs
Auch die get () - Methode, die faul ausgewertet, wenn Sie müssen. Die Standard-Injektion ausgewertet, beim starten und werfen Sie eine exception, wenn keine Bohnen gefunden werden, die die Injizierung der bean wird injiziert zur Laufzeit natürlich, aber die Anwendung wird nicht gestartet, wenn dies nicht möglich ist.
In der Dokumentation finden Sie weitere Beispiele, wie filter die Instanzen injiziert und viel, viel mehr.
javax.enterprise.inject.Instance
spezifischen JEE6? Ich sehe es nicht in die JSR-330-Spezifikationen/pkg.Den
AutowiredAnnotationBeanFactoryPostProcessor
(Spring 3.2) enthält diese Methode, um zu bestimmen, ob eine unterstützt "Autowire' annotation erforderlich ist oder nicht:In kurzen, Nein, nicht standardmäßig.
Name der Methode wird nach Begriffen standardmäßig ist 'erforderlich', das ist nicht ein Feld, auf dem
@Inject
annotation, somethod
wirdnull
undtrue
zurückgegeben werden.Können Sie in der Lage sein, um das zu ändern, indem bilden von Unterklassen dieser
BeanPostProcessor
und überschreiben derdetermineRequiredStatus(Annotation)
Methode den Wert true zurück, oder eher, etwas 'schlauer'.@Optional
Verhalten.@Optional
Verhalten umfassen würde hier den Vorschlag von meine eigene BeanPostProccessor, aber das scheint wie eine Menge von overkill. Ich finde es schade, dass JSR330 nicht das @ - Optional annotation.