2016-11-04 6 views
0

私はSpringアプリケーションを使用しています。私のシナリオの1つでは、Serviceクラスの2つの実装を記述する必要がありました。私は実行時にサービスIDに基づいてサービス層でこれを自動配線する方法を知りたいと思います。変数を使用してオートワイヤードプロパティを修飾する方法

@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) {} 
} 

ここで、製品IDによって、PricingManager1またはPricingManager2のいずれかのメソッドが呼び出されます。どのように動的に同じを達成するために?私がqualifierでServiceクラスをオートワイヤリングすると、メインクラスのqulifierとしてruntime productIdを渡すことができますか?

答えて

0

あなたは@Serviceを使用して、以下に示すように、あなたのmain()に春contextオブジェクトからBeanを取得することにより、期待される出力を達成することができます

サービスクラス:

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

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

メインクラス:

//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

ありがとう...しかし、同じ方法で変数autowiring経由で達成する方法はありますか? – user2753694

0

あなたは春ブートを使用している場合は、@Bean とともに@ConditionalOnExpression注釈とSPELを使用することによって、これを達成することができます。

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

あなたは春のブートを使用してない場合は、春から@Conditionalを使用していますが、これは、同じ結果を得るために多くの努力が必要になります。

関連する問題