首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring :如何将依赖项注入库调用的类中?

Spring :如何将依赖项注入库调用的类中?
EN

Stack Overflow用户
提问于 2018-08-18 00:45:47
回答 1查看 671关注 0票数 0

我正在使用(KCL)和Spring。要使用KCL,我必须为接口RecordProcessor实现一个类(我将其命名为IRecordProcessor )。KCL将调用这个类和来自运动的过程记录。但是当我尝试使用依赖注入时,我发现它没有成功。

以下是RecordProcessor的片段

代码语言:javascript
复制
@Component
public class RecordProcessor implements IRecordProcessor {

    @Autowired
    private SingleRecordProcessor singleRecordProcessor;

    @Override
    public void initialize(String shardId) {
        ...
    }

    @Override
    public void processRecords(List<Record> records, IRecordProcessorCheckpointer checkpointer) {
        ...
    }
}

我使用Class SingleRecordProcessor处理单个记录的运动。这是我的SingleRecordProcessor类片段:

代码语言:javascript
复制
@Component
public class SingleRecordProcessor {

    private Parser parser;

    private Map<String, Table> tables;

    public SingleRecordProcessor() {
    }

    @Autowired
    private void setParser(Parser parser) {
        this.parser = parser;
    }
    @Autowired
    private void setTables(Map<String, Table> tables) {
        this.tables = tables;
    }

    public void process(String record) {
        ...
    }
}

我希望让spring框架自动将SingleRecordProcessor实例注入类并使用它。但是我发现字段singleRecordProcessor是空的。

知道为什么依赖注入失败了吗?还是不可能将依赖项注入到其他框架(本例中是KCL)调用的类中?如有任何建议,将不胜感激!真的需要帮助!!

更新

对不起,没有清楚地表达错误。错误是NullPointerException。我尝试在上面注入singleRecordProcessor并调用process()方法。我认为注入没有成功,因此实例singleRecordProcessor为null,而出现了NullPointerException。

详情如下:

我有一个主修课叫Application

代码语言:javascript
复制
@SpringBootApplication
public class Application{
    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(Application.class);
        application.addListeners(new ApplicationPidFileWriter("./app.pid"));
        ConfigurableApplicationContext ctx = application.run(args);
    }
}

我有一个叫KCL的MainProcessor类。

代码语言:javascript
复制
@Service
public final class MainProcessor {
    @EventListener(ApplicationReadyEvent.class)
    public static void startConsumer() throws Exception {
        init();
        IRecordProcessorFactory recordProcessorFactory = new RecordProcessorFactory();
        Worker worker = new Worker(recordProcessorFactory, kinesisClientLibConfiguration);
        ...
        worker.run(); // this line will call KCL library and eventually call ProcessorRecord class.
    }
}

UPDATE2

RecordProcessorFactory只有一个这样的方法

代码语言:javascript
复制
@Component
public class RecordProcessorFactory implements IRecordProcessorFactory {
    @Autowired
    RecordProcessor recordProcessor;
    @Override
    public IRecordProcessor createProcessor() {
        return recordProcessor;
    }
}

它为KCL创建一个新的RecordProcessor实例来使用它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-18 06:29:42

您应该将此实例自动导入到MainProcessor中:

代码语言:javascript
复制
@Component
public class RecordProcessorFactory {
    @Lookup IRecordProcessor createProcessor() { return null; }
}

Spring将为您实例化一个RecordProcessorFactory,并将其中的createProcessor()实现替换为每次调用它时返回一个新IRecordProcessor的实现。工厂和处理器都将是Spring -这就是您想要的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51904343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档