我正在学习java和Springboot。在一个开源存储库https://github.com/gitbitex/gitbitex-new中,Bootstrap.java类包含一个没有被使用的代码。具体来说,考虑以下代码:
private final ModifiedObjectWriter modifiedObjectWriter;
private final EngineSnapshotTaker engineSnapshotTaker;
private final OrderBookSnapshotTaker orderBookSnapshotTaker;
private final List engineListeners;
@PostConstruct
public void init() {
startMatchingEngine(1);
startOrderPersistenceThread(1);
startTradePersistenceThread(1);
startAccountPersistenceThread(1);
startCandleMaker(1);
startTickerThread(1);
}
private void startMatchingEngine(int nThreads) {
for (int i = 0; i < nThreads; i++) {
String groupId = "MatchingEngine";
KafkaConsumer<String, Command> consumer = new KafkaConsumer<>(getProperties(groupId),
new StringDeserializer(), new CommandDeserializer());
MatchingEngineThread matchingEngineThread = new MatchingEngineThread(consumer, engineSnapshotStore,
engineListeners, appProperties);
matchingEngineThread.setName(groupId + "-" + matchingEngineThread.getId());
matchingEngineThread.start();
threads.add(matchingEngineThread);
}
}
我对此的观察。
(a)前三个类,modifiedObjectWriter、EngineSnapshotTaker和OrderBookSnapshotTaker扩展了EngineListener类,但这些类显然没有被使用。
(b)正在使用engineListener,但它似乎是一个空List。
(c)modifiedObjectWriter使用@Component进行注解。
(d)在运行时,engineListeners列表被发现包含这三个类的示例,
现在我想知道,这些类是如何注入到engineListener列表中的?请参考存储库以了解我可能错过的任何细节。
2条答案
按热度按时间lrpiutwd1#
**engineListeners包含三个类的示例,因为这三个类都扩展了EngineListener类,因此属于每个类的bean都被添加到列表中。这可能是因为自动绑定bean的一个属性,它遵循当您自动绑定特定类的列表时,然后它会自动将属于该类或其子类的所有bean添加到该列表中。**有关详细信息,请参阅以下链接:
https://stackoverflow.com/questions/7446301/autowire-reference-beans-into-list-by-type
此外,您正在使用Lombok的@RequiredArgsConstructor,会自动为您生成一个构造函数。由于它是唯一的构造函数,Spring使用它来自动连接Bootstrap的依赖项,包括engineListeners(不需要显式地需要'@ Autowired')。请参阅此以了解有关不使用@Autowired的自动依赖注入的更多详细信息-
cigdeys32#
Bootstrap类上有两个注解与此相关:
@Component
是一个Spring annotation。这意味着它将是一个Spring管理的“bean”,Spring将创建Bootstrap
的示例,并将其依赖项注入其中。这些依赖项将通过查看其他Spring管理的bean并找到与构造函数所需类型匹配的bean来解决。其中注入的类型是List<T>
,Spring将使用类型信息并注入一个列表,其中包含与所需类型匹配的每个bean。例如,List<EngineListener>
将注入一个列表,其中包含Spring已知的每个EngineListener
bean。@RequiredArgsConstructor
是一个Lombok annotation。在编译期间,它会导致生成一个构造函数,该类中的每个final字段都有一个参数。该类有18个final字段:这将导致Lombok生成一个具有18个参数的构造函数。当Spring创建
Bootstrap
类的示例时,每个参数都将被Spring注入。在我看来,如果你正在学习Java,你可能想看看一个不同的代码库。一个有18个构造函数参数的类非常复杂,有些人会认为它需要被分成一些更小、更易于管理的类。你可能也想避免使用Lombok,至少在你理解它为你生成的代码是什么样子之前。