为了账号安全,请及时绑定邮箱和手机立即绑定

调用 SuperClass 中的服务,其实现被注入到子类中

调用 SuperClass 中的服务,其实现被注入到子类中

LEATH 2021-06-01 09:11:53
我在 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 @Italianpublic class ItalianFoodService extends FoodService {    @Inject @Italian RecipeService recipeService;    @Override    protected RecipeService getRecipeService() {        return recipeService;    }    ...}@ApplicationScoped @Chinesepublic 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 将被隐藏但不会被子类覆盖。
查看完整描述

2 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

我想出了一种不同的方法,它允许我非常直观地使用注入的服务。


使用构造函数注入的解决方案:


public abstract class FoodService {

    protected RecipeService recipeService;


    FoodService (RecipeService recipeService) {

        this.recipeService = recipeService;

    }

}


public class ItalianFoodService extends FoodService {

    // Only needed if ItalianRecipeService holds additional methods.

    @Inject @Italian ItalianRecipeService recipeService;


    @Inject

    ItalianFoodService(@Italian RecipeService recipeService) {

       super(recipeService);

    }

}

或者,也可以通过


使用@PostConstruct 的解决方案:


public abstract class FoodService {

    protected RecipeService recipeService;

}


public class ItalianFoodService extends FoodService {

    // Only needed if ItalianRecipeService holds additional methods.

    @Inject @Italian ItalianRecipeService recipeService;


    @PostConstruct

    postConstruct() {

       super.recipeService = recipeService;

    }

}

两种解决方案都非常简短且可读,而具有构造函数注入的解决方案对注入的处理稍微更加明确。


查看完整回答
反对 回复 2021-06-02
  • 2 回答
  • 0 关注
  • 127 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信