30

春を使用しているとします。次の戦略があります...

インターフェース

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) を使用する際に私が抱えている問題も、Dao が注入されないため、戦略の cookeryDao 呼び出しが null ポインターを返すことです。

春を使用して上記のパターンを実装し、スレッドセーフにする方法を教えてください。私がしようとしていることは可能ですか?

4

2 に答える 2

35

単純な依存性注入を使用します。

@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 修飾子を作成することを選択できます。

以下も参照してください。

春で戦略パターンを効率的に実装する方法は?

@Resource vs @Autowired

于 2013-07-13T12:23:06.157 に答える