2013-07-13 11 views
12

Dire che sto utilizzando la primavera, ho le seguenti strategie ...modello di strategia con i fagioli di primavera

interfaccia

public interface MealStrategy { 
    cook(Meat meat); 
} 

prima strategia

@Component 
public class BurgerStrategy implements 
MealStrategy { 
    @Autowired CookerDao cookeryDao; 

    @Override 
    public void cook(Meat meat) { 
     cookeryDao.getBurger(meat); 
    } 
} 

strategia successiva ...

@Component 
public class SausageStrategy implements 
MealStrategy { 
    @Autowired CookerDao cookeryDao; 

    @Override 
    public cook(Meat meat) { 
     return cookeryDao.getSausage(meat); 
    } 
} 

Cont. ext ...

@Component 
@Scope("prototype") 
public class MealContext { 
    private MealStrategy mealStrategy; 

    public void setMealStrategy(MealStrategy strategy) { 
     this.strategy = strategy; 
    } 

    public void cookMeal(Meat meat) { 
     mealStrategy.cook; 
    } 
} 

Ora dicono che questo contesto è stato a cui si accede attraverso un controller MVC, come ...

@Autowired 
private MealContext mealContext; 

@RequestMapping(method = RequestMethod.POST) 
public @ResponseBody Something makeMeal(Meat meat) { 
    mealContext.setMealStrategy(new BurgerStrategy()) 
    mealContext.cookMeal(meat); 
} 

caso in cui il contesto essere un componente? Quando ottengo un errore che dice loadOnStartup c'è un nonUniqueBean che la strategia potrebbe essere, come ci si aspetterebbe. Tutti i bean devono essere componenti come sopra o le mie annotazioni sono errate?

La mia più grande domanda è in realtà è possibile utilizzare un contesto come quello in un'app di Spring MVC? Il problema che ho con l'uso di @Scope (prototipo) è che le chiamate di cookery nelle strategie restituiscono un puntatore nullo poiché i Dao non vengono iniettati.

Come implementare il motivo sopra riportato utilizzando la molla e anche il thread-safe? E 'quello che sto provando anche possibile?

+0

Qual è esattamente il tuo problema? tutto questo funziona per me – morgano

+0

Voglio sapere se è thread-safe avere un contesto come quello che ho fatto – david99world

+0

anche quello sopra non funzionerebbe perché come ho fatto 'nuovo' questo è al di fuori del contesto di primavera? – david99world

risposta

16

Vorrei utilizzare la semplice iniezione delle dipendenze.

@Component("burger") 
public class BurgerStrategy implements MealStrategy { ... } 

@Component("sausage") 
public class SausageStrategy implements MealStrategy { ... } 

controller

Opzione A:

@Resource(name = "burger") 
MealStrategy burger; 

@Resource(name = "sausage") 
MealStrategy sausage; 

@RequestMapping(method = RequestMethod.POST) 
public @ResponseBody Something makeMeal(Meat meat) { 
    burger.cookMeal(meat); 
} 

Opzione B:

@Autowired 
BeanFactory bf; 

@RequestMapping(method = RequestMethod.POST) 
public @ResponseBody Something makeMeal(Meat meat) { 
    bf.getBean("burger", MealStrategy.class).cookMeal(meat); 
} 

È possibile scegliere di creare JSR-330 qualificazioni al posto dei nomi testuali per la cattura di errori di ortografia durante la compilazione tempo.

Consulta anche:

How to efficiently implement a strategy pattern with spring?

@Resource vs @Autowired

20

Dal momento che una strategia concreta è molto spesso determinato in fase di esecuzione in base ai parametri forniti o giù di lì, vorrei suggerire qualcosa come segue.

@Component 
public class BurgerStrategy implements MealStrategy { ... } 

@Component 
public class SausageStrategy implements MealStrategy { ... } 

poi iniettare tutti tali strategie in una mappa (con il nome di fagioli come chiave) nel controller dato e selezionare rispettiva strategia su richiesta.

@Autowired 
Map<String, MealStrategy> mealStrategies = new HashMap<>; 

@RequestMapping(method=RequestMethod.POST) 
public @ResponseBody Something makeMeal(@RequestParam(value="mealStrategyId") String mealStrategyId, Meat meat) { 
    mealStrategies.get(mealStrategyId).cook(meat); 

    ... 
} 
+1

Questa risposta fornisce una più reale implementazione del modello di strategia – Cuga

Problemi correlati