【发布时间】:2017-07-06 22:20:39
【问题描述】:
我有三个 maven 模块:
- Commons 模块: 常用操作
- Provider 模块: 提取数据的具体实现。
- 主模块:利用提供者模块。
顺序如下:
-
主模块接收请求,并有一个接口管理提供程序 (
Client) 和使用ServiceLoader.load(Provider.class)加载提供程序。 - 我的
Client提取数据 (client.retrieveData(request)) 选择了合适的提供者。 - 提供者实现方法
buildRequest()。
这是我的问题:来自 commons 模块的支持类在其他两个模块中使用。我可以使用我在主模块中注入的所有类,但在提供程序模块中注入的类有一个空指针。例如,这是一个提供者类的实现:
public class ScholarProvider extends AbstractProvider {
@Inject
private DistanceService distance;
@Inject
private final Logger log;
public static final String URL = "https://scholar.google.com";
private MapperObjectRDF mapper;
private String[] domains;
private Person person;
public ScholarProvider() {
person = null;
mapper = null;
}
}
在ScholarProvider 和任何其他提供程序中,距离和日志为空。我无法理解问题出在哪里。通过ServiceLoader 加载提供程序会不会是问题?有什么建议可能是什么问题?或者有什么可能的解决方案可以让我将DistanceService 与新的实例化一起使用?
【问题讨论】:
-
您的问题出在这里:
ServiceLoader.load(Provider.class)通过ServiceLoader 加载一个类不会自动将它注册到CDI 容器中。其次,如果您想在部署期间通过选择类的路线,则使用@Alternative标记您的所有提供程序并启用您希望从beans.xml中选择的选项,CDI 方式
标签: java dependency-injection cdi