2015-03-09 7 views
0

Я реализующий шаблон стратегии с помощью пружины и загрузки правильной реализации стратегии, следовать этому примеру:Как загрузить карту стратегии, используя весну и аннотации?

public class ShippingServiceImpl implements ShippingService { 
// Map of strategies 
private Map<ShippingType,ShippingCostStrategy> shippingCostStrategies; 

@Required 
public void setShippingCostStrategies(Map<ShippingType,ShippingCostStrategy> strategies) { 
    this.shippingCostStrategies = strategies; 
} 

@Override 
public BigDecimal calculateShippingCost(ShoppingCart cart) { 
    return shippingCostStrategies.get(cart.getShippingType()).shippingCost(cart); 
} 

// ...other business logic... 
} 

Как это лучший способ загрузить эту стратегию Карты? Мне нужен конкретный метод, который загружает карту и переходит к setShippingCostStrategies? Могу ли я это сделать с помощью Spring Annotations? потому что в этом примере, автор сделать это с помощью конфигурации:

<bean id="shippingService"  class="it.nicus.springstrategy.ShippingServiceImpl"> 
<property name="shippingCostStrategies"> 
    <map> 
    <entry> 
    <key><util:constant static- field="it.nicus.springstrategy.ShippingType.NORMAL"/></key> 
    <bean class="it.nicus.springstrategy.PerItemCostStrategyImpl"> 
    <property name="baseCost" value="5.00"/> 
    <property name="costPerItem" value="2.00"/> 
    </bean> 
    </entry> 
    <entry> 
    <key><util:constant static- field="it.nicus.springstrategy.ShippingType.PRIME"/></key> 
    <bean class="it.nicus.springstrategy.FixedCostStrategyImpl"> 
    <property name="fixedCost" value="3.00" /> 
    </bean> 
    </entry> 
    </map> 
</property> 
</bean> 

ответ

1

Вы можете зарегистрировать map как боб, используя <util:map> тега, а затем использовать @Resource аннотации autowire этой карты.

<util:map id="strategyMap"> 
    <entry> 
     <key> 
      <util:constant static-field="it.nicus.springstrategy.ShippingType.NORMAL" /> 
     </key> 
     <bean class="it.nicus.springstrategy.PerItemCostStrategyImpl"> 
      <property name="baseCost" value="5.00" /> 
      <property name="costPerItem" value="2.00" /> 
     </bean> 
    </entry> 
    <entry> 
     <key> 
      <util:constant static-field="it.nicus.springstrategy.ShippingType.PRIME" /> 
     </key> 
     <bean class="it.nicus.springstrategy.FixedCostStrategyImpl"> 
      <property name="fixedCost" value="3.00" /> 
     </bean> 
    </entry> 
</util:map> 

А потом, в ShippingServiceImpl классе, впрыснуть это следующим образом:

public class ShippingServiceImpl implements ShippingService { 
    // Map of strategies 
    @Resource(name="strategyMap") 
    private Map<ShippingType,ShippingCostStrategy> shippingCostStrategies; 
} 
+0

спасибо !! В чем преимущество создания фабрики? – Phopes

+0

@ Mr.PaulHenry Извините, я не понял? –

+0

Например, вместо этого, чтобы загрузить в Map, все стратегии, Могу ли я создать фабрику, которая проверяет параметр, используя if conditional и возвращает правильную реализацию? этот подход плохой, связанный с этим? – Phopes

 Смежные вопросы

  • Нет связанных вопросов^_^