2013-08-13 14 views
7

Ich versuche, für @Qualifier, eine Eigenschaft Platzhalter als das Attribut wie folgt zu verwenden:Frühling: Mit @Qualifier mit Property Platzhalter

@Autowired 
@Qualifier("${beanName}") 
private MyBean myBean; 

Dies ist jedoch nicht funktioniert, obwohl die Eigenschaft Platzhalter zur Verfügung als Stringwert:

Was wäre hier ein guter Workaround, vielen Dank.

+0

Eine gute Problemumgehung hängt von Ihrem Gesamtziel ab. Welches allgemeine Problem möchten Sie lösen? – Ralph

+0

Ich verwende eine Spring 3 ProprtySource, um den Namen der Bean an den Kontext zu übergeben, wenn sie geladen wird. Dies ist der Schlüssel: Der Bean-Name muss als Argument in den Anwendungskontext übergeben werden. Das Argument wird von der Annotation @Value erkannt, nicht jedoch von Qualifier. – user1052610

+3

Aber warum? Es könnte sein, dass es bessere Alternativen zu Ihrem Ziel gibt. Wenn ich eine blinde Vermutung anstellen sollte, klingt es so, als ob die Bean-Profile von Spring 3.1 zu dem passen, was Sie anstreben. –

Antwort

1

Ich kann keinen Kommentar abgegeben so dass diese meine Antwort ist: (? Wich Ergebnis streben Sie)

Als Adam B vielleicht gesagt, Sie Federprofile verwenden können, das Ergebnis Sie streben zu erreichen.

Eine andere Sache, die Sie tun können, ist:

configure eine Karte in Ihrem XML-Kontextkonfiguration wie folgt aus (die Feder util-Namespace):

<util:map id="mapId" key-type="java.lang.String" value-type="com.xxx.interface-or-superclass"> 
     <beans:entry key="${property.bean.name.1}" value-ref="bean1-defined-elsewehere"/> 
     <beans:entry key="${property.bean.name.2}" value-ref="bean2-defined-elsewehere"/> 
     <beans:entry key="${property.bean.name.3}" value-ref="bean3-defined-elsewehere"/> 
    </util:map> 

dann können Sie diese Karte in einer Bohne laden genannt z.B. "Com.xxx.BeanSelector"

@Value("#{mapId}") 
private Map<String, com.xxx.interface-or-superclass> myMap; 

und auf diese Bohne ein methos wie folgt hinzu:

public interface-or-superclass getBean(String beanName){ 
    return myMap.get(beanName); 
} 

ok jetzt können Sie Ihre letzte Klasse ähnlich wie diese haben:

@Autowired 
private BeanSelector beanSelector; 

@Value("${property.name.the.bean.you.want.to.use}") 
private String beanName; 

private interface-or-superclass myBean; 

Dann können Sie myBean (möglicherweise innerhalb der Methode afterPropertiesSet(), wenn Sie die Schnittstelle InitializingBean implementieren)

auf diese Weise:

myBean = beanSelector.getBean(beanName); 
// then check ifthe bean is not null or something like that 

Ok es ist ein wenig chaotisch und vielleicht können Sie auf eine andere Weise wirken auf das, was Sie erreichen wollen, aber es ist eine Abhilfe.

0

Nur ein Versuch (nicht wirklich das Problem zu lösen). Sie können den Namen der festen Bean wie gewohnt verwenden (Autowire mit Platzhalter wird nicht unterstützt), aber Sie können verschiedene Bean-Implementierungen basierend auf dem Eigenschaftswert aus verschiedenen XML-Dateien laden.
. Sonst denke über eine Lösung basierend auf Bean Alias. Meine 2 Cent

9

Ich stieß genau auf das gleiche Problem. Verwenden Sie einfach Resource

@Resource(name="${beanName}") 
private MyBean myBean; 
Verwandte Themen