【发布时间】:2013-07-11 20:56:29
【问题描述】:
说我在用spring,我有以下策略……
界面
public interface MealStrategy {
cook(Meat meat);
}
第一个策略
@Component
public class BurgerStrategy implements
MealStrategy {
@Autowired CookerDao cookeryDao;
@Override
public void cook(Meat meat) {
cookeryDao.getBurger(meat);
}
}
下一个策略...
@Component
public class SausageStrategy implements
MealStrategy {
@Autowired CookerDao cookeryDao;
@Override
public cook(Meat meat) {
return cookeryDao.getSausage(meat);
}
}
上下文...
@Component
@Scope("prototype")
public class MealContext {
private MealStrategy mealStrategy;
public void setMealStrategy(MealStrategy strategy) {
this.strategy = strategy;
}
public void cookMeal(Meat meat) {
mealStrategy.cook;
}
}
现在说这个上下文是通过一个 mvc 控制器访问的,比如...
@Autowired
private MealContext mealContext;
@RequestMapping(method = RequestMethod.POST)
public @ResponseBody Something makeMeal(Meat meat) {
mealContext.setMealStrategy(new BurgerStrategy())
mealContext.cookMeal(meat);
}
上下文应该是一个组件吗?当我这样做时,我收到一条错误消息,提示 loadOnStartup 并且正如您所期望的那样,该策略可能是一个 nonUniqueBean。是不是所有的 bean 都需要像上面这样的组件,还是我的注释不正确?
我最大的疑问是你能在 Spring MVC 应用程序中使用这样的上下文吗?我使用@Scope(prototype) 的问题也是这意味着策略中的cookeryDao 调用返回一个空指针,因为Dao 没有被注入。
如何使用 spring 实现上述模式并且线程安全?我正在尝试的可能吗?
【问题讨论】:
-
您的问题到底是什么?这一切都对我有用
-
我想知道像我这样拥有上下文是否是线程安全的
-
以上也行不通,因为正如我所做的那样
new这不在 Spring 上下文中?
标签: java spring strategy-pattern