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

我在 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 将被隐藏但不会被子类覆盖。


LEATH
浏览 128回答 2
2回答

ABOUTYOU

我想出了一种不同的方法,它允许我非常直观地使用注入的服务。使用构造函数注入的解决方案: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;    }}两种解决方案都非常简短且可读,而具有构造函数注入的解决方案对注入的处理稍微更加明确。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java