模块和ServiceLoader

时间:2017-07-06 22:20:39

标签: java dependency-injection cdi

我有三个maven模块:

  1. Commons模块:常用操作
  2. 提供商模块:提取数据的具体实现。
  3. 主要模块:使用提供程序模块。
  4. 序列的工作原理如下:

    • 主模块接收请求,并且有一个界面使用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进行新的实例化?

2 个答案:

答案 0 :(得分:0)

您的cdi框架是否知道提供程序是要注入的bean?如果您使用的是Spring,则需要使用@Named或任何继承自@Componenent的spring特定注释来注释该类,然后确保扫描该类。如果您的框架不了解您的bean,它将不会进行任何注入。

答案 1 :(得分:0)

您所描述的不是CDI的工作原理。在CDI方式中,您将定义每个类并为它们提供限定符。然后你将使用限定符注入它们。

所以不是使用ServiceLoader.load()而是注入引用,就像这样

@Inject
@Named("the name")
private Provider provider