我正在开发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传递?
答案 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 ,但这需要更多努力才能获得相同的结果