Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java springbeans战略模式_Java_Spring_Strategy Pattern - Fatal编程技术网

Java springbeans战略模式

Java springbeans战略模式,java,spring,strategy-pattern,Java,Spring,Strategy Pattern,假设我使用spring,我有以下策略 接口 public interface MealStrategy { cook(Meat meat); } 第一战略 @Component public class BurgerStrategy implements MealStrategy { @Autowired CookerDao cookeryDao; @Override public void cook(Meat meat) { cookeryDao.getB

假设我使用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 an,正如您所期望的,这个策略可能是一个非UniqueBean。是否所有的bean都需要像上面那样的组件,还是我的注释不正确

我最大的疑问是,你能在SpringMVC应用程序中使用这样的上下文吗?我在使用@Scope(prototype)时遇到的问题也是,这意味着策略中的CoordoYDAO调用返回空指针,因为Dao没有被注入


我如何使用spring实现上述模式,同时又是线程安全的?我正在尝试的是可能的吗?

我会使用简单的依赖注入

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

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

备选方案A:

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

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

@RequestMapping(method = RequestMethod.POST)
public @ResponseBody Something makeMeal(Meat meat) {
    burger.cookMeal(meat);
}
备选案文B:

@Autowired
BeanFactory bf;

@RequestMapping(method = RequestMethod.POST)
public @ResponseBody Something makeMeal(Meat meat) {
    bf.getBean("burger", MealStrategy.class).cookMeal(meat);
}
您可以选择创建JSR-330限定符而不是文本名称,以便在编译时捕获拼写错误

另见:


由于具体的策略通常是在运行时根据提供的参数确定的,所以我建议如下

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

@Component
public class SausageStrategy implements MealStrategy { ... }
然后将所有这些策略注入给定控制器中的映射(以bean名称作为键),并根据请求选择相应的策略

@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);

    ...
}
@Autowired
Map mealStrategies=新HashMap;
@RequestMapping(method=RequestMethod.POST)
public@ResponseBody Something makemeedin(@RequestParam(value=“mealStrategyId”)字符串mealStrategyId,Meat-Meat){
食物策略。获取(食物策略ID)。烹饪(肉);
...
}

您到底有什么问题?所有这些对meI来说都是有效的。我想知道像我这样的上下文是否是线程安全的。所以上面的内容不起作用,因为我已经做了
new
,这是Spring上下文之外的内容?这个答案给出了一个更真实的策略模式实现。默认情况下,组件不是singleton吗?我知道这是一篇旧文章,但格式是什么是“mealStrategyId”,是类名还是完全限定名?是的,这将是BeanNameGood策略模式示例。向上投票。吹毛求疵,你很可能只需要“地图策略”,而不是新的,因为集合是注入的。如果你有多个构造函数,也许你会保留新的。但这很少见。选项1真的是一个解决方案吗?每次我们都需要将实现类作为资源进行自动连接。假设我们最终拥有100个实现类……控制器类不是很难管理吗?