如何使用变量限定自动装配的属性

时间:2016-11-04 11:30:40

标签: spring autowired

我正在开发Spring应用程序,对于我的一个场景,我必须编写两个Service类的实现。我想知道如何在运行时基于服务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) {}
}

现在,根据productId,将调用PricingManager1或PricingManager2上的方法。如何动态实现相同?如果我使用限定符自动装配Service类,有没有办法在主类中将运行时productId作为qulifier传递?

2 个答案:

答案 0 :(得分:0)

您可以使用@Service然后从context中的弹簧main()对象获取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 :(得分:0)

如果您使用的是Spring Boot ,则可以使用 @ConditionalOnExpression 注释和 SpEL 以及 @Bean <来实现此目的/强>

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

如果您使用Spring Boot,请使用Spring 4 中的 @Conditional ,但这需要更多努力才能获得相同的结果