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

时间:2018-08-18 00:45:48

标签: java spring spring-boot amazon-kinesis

我正在使用Kinesis Client Library(KCL)和Spring启动。要使用KCL,我必须为接口RecordProcessor实现一个类(我将其命名为IRecordProcessor)。 KCL将调用此类并处理运动学中的记录。但是当我尝试使用依赖注入时,发现它没有成功。

以下是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类片段:

@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

的专业班
@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类,它将称为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;
    }
}

它将为KCL创建一个新的RecordProcessor实例以供使用。

1 个答案:

答案 0 :(得分:0)

您应将此实例自动连接到MainProcessor中:

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

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