春天& Java Generics - 在抽象控制器中获取一个服务的实例

时间:2017-10-12 13:13:12

标签: java spring generics dependency-injection

我有一个打字的服务界面:

public interface BaseArticleService<T extends BaseArticle> {    
    T getById(Long id);    
}

并有两个扩展它的接口:

public interface AccArticleService extends BaseArticleService<AccArticle> {

}

public interface ExpArticleService extends BaseArticleService<ExpArticle> {    
    Long getCount();    
}

然后我有一个类似的控制器架构:

public abstract class BaseArticleController<T extends BaseArticle> {

    @Autowired
    BaseArticleService<T> baseArticleService;

}

@Controller
@RequestMapping(value = "/exp/articles")
public class ExpArticleController extends BaseArticleController<ExpArticle> {
}

@Controller
@RequestMapping(value = "/acc/articles")
public class AccArticleController extends BaseArticleController<AccArticle> {
}

现在,如果我想获取在BaseController中注入的BaseArticleService的ExpArticleService实例,我该如何实现?

如果我这样做:

public BaseArticleService<ExpArticle> getExpArticleService() {
    return super.baseArticleService;
}

然后我无法调用getCount()

之类的getExpArticleService().getCount()方法

并且不能这样做:

public ExpArticleService getExpArticleService() {
    return super.baseArticuloService;
}

那么解决方案是什么?也许在我的ExpArticleService中注入另一个ExpArticleController

1 个答案:

答案 0 :(得分:1)

使用DI时,您的定义依赖于界面。如果您注入BaseArticleService,那么您可以使用的唯一方法是此接口中定义的方法。在您的情况下T getById(Long id);

你的方式并不坏,你有一个通用的超类,它允许你很容易地用不同的参数初始化界面,但是你不应该期望明确地获得任何特定的实现。 (也许你可以检查并施放,但那里不干净)。

如前所述,您应该在另一个类中提取特定的实现,并将其直接注入需要它的控制器中。保留你的通用,这是一个很好的方法来处理将在你的控制器之间共享的所有参数化方法