2016-11-04 2 views
0

Ich arbeite an einer Spring-Anwendung und für eines meiner Szenarien musste ich zwei Implementierungen einer Service-Klasse schreiben. Ich würde gerne wissen, wie man dies in einer Service-Schicht basierend auf der Service-ID zur Laufzeit autowire.Wie kann ich eine Autowired-Eigenschaft mit einer Variablen qualifizieren

@Autowired 
ProductPricing accessProduct; 

public static void main(String args[]) 
{ 
long productId = serviceDao.getService(site.getSiteID()).getServiceId(); 

accessProduct.calculatePrice(pricingParam) 
} 

public class PricingManager1 implements ProductPricing 
{ 
    public void calculatePrice(Parmeter pricingParam) {} 
} 

public class PricingManager2 implements ProductPricing 
{ 
    public void calculatePrice(Parmeter pricingParam) {} 
} 

Nun wird abhängig von der productId entweder die Methode auf PricingManager1 oder PricingManager2 aufgerufen. Wie erreiche ich das dynamisch? Wenn ich die Service-Klassen mit Qualifier autowire, gibt es irgendeine Möglichkeit, wie wir die Runtime productId als Quifier in der Hauptklasse weitergeben können?

Antwort

0

Sie können die erwartete Ausgabe erreichen, indem @Service verwenden und dann bekommen die Bohne vom Frühjahr context Objekt in Ihrem main() wie unten dargestellt:

Service-Klassen:

@Service("pricingManager1") 
public class PricingManager1 implements ProductPricing 
{ 
    public void calculatePrice(Parmeter pricingParam) {} 
} 

@Service("pricingManager1") 
public class PricingManager2 implements ProductPricing 
{ 
    public void calculatePrice(Parmeter pricingParam) {} 
} 

Hauptklasse:

//No Autowiring 
public static void main(String args[]) 
{ 
long productId = serviceDao.getService(site.getSiteID()).getServiceId(); 

//get the spring context object 

//get the bean from context 
if(productId == condition) { 

    beanContext.getBean("pricingManager1").calculatePrice(pricingParam) 
} else { 
    beanContext.getBean("pricingManager2").calculatePrice(pricingParam) 
} 
} 
+1

ok, danke ... aber gibt es einen Weg, das gleiche über den variablen Autowiderstand zu erreichen? – user2753694

0

Wenn Sie mit Spring Boot-, können Sie dies erreichen, indem @ConditionalOnExpression Annotation und Spel zusammen mit @Bean verwenden.

@ConditionalOnExpression("#{this.productId == 999}") 

Wenn Sie nicht mit Spring-Boot sind, verwenden @Conditional von Spring , aber das wird mehr Aufwand benötigt das gleiche Ergebnis zu erhalten.

Verwandte Themen