Spring 引导:如何将依赖项注入库调用的 class?

Spring Boot: how to inject dependencies into a class called by a library?

我正在使用 Kinesis 客户端库 (KCL) 和 Spring 启动。要使用 KCL,我必须为接口 IRecordProcessor 实现一个 class(我将其命名为 RecordProcessor)。 KCL 将调用此 class 并处理来自 kinesis 的记录。但是当我尝试使用依赖注入时,我发现并没有成功。

这是 RecordProcessor 的片段:

@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 class 片段:

@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 实例注入 class 并使用它。但是我发现singleRecordProcessor这个字段是空的。

知道依赖注入失败的原因吗?还是不可能将依赖项注入到其他框架(在本例中为 KCL)调用的 class 中?任何建议将不胜感激!真的需要一些帮助!!

[更新]:

抱歉没有表达清楚错误。错误是 NullPointerException。我试图注入 singleRecordProcessor 并在其上调用方法 process()。我认为注入不成功,所以实例 singleRecordProcessor 为 null 并且出现了 NullPointerException。

更多信息如下:

我有一门专业 class 叫做 Application

@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);
    }
}

我有 MainProcessor class 将调用 KCL。

@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只有一种这样的方法

@Component
public class RecordProcessorFactory implements IRecordProcessorFactory {
    @Autowired
    RecordProcessor recordProcessor;
    @Override
    public IRecordProcessor createProcessor() {
        return recordProcessor;
    }
}

它创建了一个新的 RecordProcessor 实例供 KCL 使用。

你应该将它的一个实例自动连接到你的 MainProcessor 中:

@Component
public class RecordProcessorFactory {
    @Lookup IRecordProcessor createProcessor() { return null; }
}

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