Optional Spring-bean-Referenzen
In meine Anwendung bin ich mit ContextLoaderListener zu load-Kontext-Dateien aus vielen Gläsern mit:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:META-INF/contextBeans.xml</param-value>
</context-param>
Dies bedeutet, ich kann auf Bohnen aus anderen Gläser, ohne Sie zu importieren.
In der Anwendung gibt es mehrere deployment-Optionen und in einigen Bereitstellungen Gläser können ausgeschlossen werden. Zu unterstützen, möchte ich einige bean-Referenzen optional sein. Zum Beispiel:
<bean id="mainAppBean" class="com.someapp.MyApplication">
<constructor-arg index="0" ref="localBean"/>
<constructor-arg index="1" ref="optionalBeanReference1"/>
<constructor-arg index="2" ref="optionalBeanReference2"/>
</bean>
In dem obigen Beispiel würde ich gerne haben optionalBeanReference1 gleich null, wenn die Referenz nicht gefunden wurde (markieren Sie optional in gewisser Weise)
Kann das getan werden, im Frühjahr? oder welche Methode empfehlen Sie für das handling von dynamischen Referenzen?
InformationsquelleAutor der Frage mbdev | 2010-10-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, @cristian ' s @Autowired Antwort ist gut. , Der Aufruf der setter-Methoden, wenn die Bohnen dieser Art sind verfügbar. Jedoch, wenn Sie mehrere beans vom gleichen Typ, ich glaube der Frühling wirft eine Ausnahme. Wenn Sie kein @Autowired aus diesem oder einem anderen Grund, ich sehe ein paar Lösungen:
Könnten Sie Ihre Klasse
ApplicationContextAware
und Suche die Bohnen im Kontext selbst:Könnten Sie umkehren der Abhängigkeit. Die einzelnen optionalen Klassen könnte sich auf die mainAppBean. Ich benutze diese in bestimmte Situationen, wenn eine direkte Abhängigkeit verursachen würde Schleifen oder andere Probleme.
Dann in der SomeClass:
Könnten Sie bleiben mit Ihrer direkten Abhängigkeit und dann entweder eine Datei importieren, die mit den Bohnen definiert, oder importieren Sie eine andere Datei definieren Sie die Bohnen als null-Werte durch die Verwendung einer factory-bean. Sehen Sie diese Fabrik-code.
Glück.
InformationsquelleAutor der Antwort Gray
Meine beste Vermutung ist die Verwendung autowire-ing mit den erforderlichen false. Weiß nicht, wie Sie Ausdrücken können dies in XML aber mit annotation dieser Konfiguration würde wie folgt Aussehen:
InformationsquelleAutor der Antwort Cristian Vrabie
Mit den aktuellen Versionen von Spring (getestet mit spring 4.1) und Java-Konfiguration und Java 8 verwenden, können Sie Optional im Parameter,, und sind nur autowired, wenn verfügbar.
InformationsquelleAutor der Antwort aseychell
Gegeben, dass die bean-Referenzen in der XML-config definiert sind via die expression language (EL) können Sie Folgendes tun:
welche das
BeanExpressionContext.getObject()
Methode. Sehen hier für mehr details.InformationsquelleAutor der Antwort Brian Agnew
Gibt es keinen eingebauten Mechanismus für diese. Allerdings könnten Sie schreiben, eine ziemlich triviale
FactoryBean
Umsetzung für Sie dazu, so etwas wie dieses:Dann können Sie es wie folgt:
InformationsquelleAutor der Antwort skaffman