Spring可以自动连接实现接口的bean的不同实现
I
到类型的属性
Map<String, I>
自动,其中键是
豆子的名字
以及bean实例的值。因为您已经有了一个枚举来针对每个枚举
ProductHandler
实现,您可以利用它:
public enum ProductType {
ABC(ProductType.ABC_BEAN_NAME),
DEF(ProductType.DEF_BEAN_NAME);
public static final String ABC_BEAN_NAME = "abcProductHandler";
public static final String DEF_BEAN_NAME = "defProductHandler";
private String beanName;
ProductType(String beanName) { this.beanName = beanName; }
public String beanName() { return beanName; }
}
然后,定义你的不同
生产商
实现
@Configuration
工厂级或通过
@Service
或
@Component
注释:
@Service(ProductType.ABC_BEAN_NAME)
public class ABCProductHandler implements ProductHandler {
// ...
}
@Service(ProductType.DEF_BEAN_NAME)
public class DEFProductHandler implements ProductHandler {
// ...
}
现在,在你
ProductServiceImpl
Bean,只需自动连线
Map<String, ProductHandler>
:
@Service
public class ProductServiceImpl implements ProductService {
private final Map<String, ProductHandler> productHandlersMap;
@Autowired
public ProductServiceImpl(Map<String, ProductHandler> productHandlersMap) {
this.productHandlersMap = productHandlersMap;
}
@Override
public ProductDetails calculateProductPrice(ProductType productType) {
productHandlersMap.get(productType.beanName()).calculate();
//..some otehr code goes here
return productDetails;
}
}
这样,就可以让弹簧完成所有的喷射工作,甚至不需要使用
@PostConstruct
方法。
注意使用
productType.beanName()
里面
calculateProductPrice
方法。这样可以确保使用正确的bean来计算价格。