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 - 这就是您想要的。
我正在使用 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 - 这就是您想要的。