我在 JavaSE 应用程序中使用 Weld for Cdi。
我的一些服务有两种口味。通过Qualifier(@Italian或@Chinese)在 CDI 中进行区分。大多数服务代码位于共享超类中。
这个超类使用其他服务。那些具有通用实现的只是简单地注入到超类 ( TimerService) 中。但是如果有特定的实现,则取决于子类要选择哪种实现。
在下面的例子中: 当ItalianFoodController调用 时service.cookSoup(),它应该使用意大利的汤食谱......
public abstract class FoodService {
@Inject TimerService timerService;
abstract protected RecipeService getRecipeService();
protected void cookSoup() {
getRecipeService().getSoupRecipe();
timerService.setTimer(20);
...
}
}
@ApplicationScoped @Italian
public class ItalianFoodService extends FoodService {
@Inject @Italian RecipeService recipeService;
@Override
protected RecipeService getRecipeService() {
return recipeService;
}
...
}
@ApplicationScoped @Chinese
public class ChineseFoodService extends FoodService {
@Inject @Chinese RecipeService recipeService;
...
}
public class ItalianFoodController {
@Inject @Italian ItalianFoodService service;
...
public void cook() {
service.cookSoup();
}
}
该示例运行良好。
我的问题是:是否有 CDI 模式要摆脱getRecipeService()?
最直观的方法是:
public abstract class FoodService {
@Inject RecipeService recipeService;
...
}
public class ItalianFoodService extends FoodService {
@Inject @Italian RecipeService recipeService;
...
}
但这不起作用,因为 recipeService 将被隐藏但不会被子类覆盖。
ABOUTYOU
相关分类