Spring Boot 如何在不将类指定给变量的情况下示例化它?

eqqqjvef  于 2023-03-29  发布在  Spring
关注(0)|答案(2)|浏览(148)

我正在学习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列表中的?请参考存储库以了解我可能错过的任何细节。

lrpiutwd

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的自动依赖注入的更多详细信息-

https://stackoverflow.com/a/41092831/21497826
cigdeys3

cigdeys32#

Bootstrap类上有两个注解与此相关:

@Component
@RequiredArgsConstructor
public class 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字段:

private final OrderManager orderManager;
    private final AccountManager accountManager;
    private final OrderBookSnapshotStore orderBookSnapshotStore;
    private final TradeRepository tradeRepository;
    private final ProductRepository productRepository;
    private final ProductManager productManager;
    private final CandleRepository candleRepository;
    private final KafkaMessageProducer messageProducer;
    private final TickerManager tickerManager;
    private final AppProperties appProperties;
    private final KafkaProperties kafkaProperties;
    private final RedissonClient redissonClient;
    private final List<Thread> threads = new ArrayList<>();
    private final EngineSnapshotStore engineSnapshotStore;
    private final ModifiedObjectWriter modifiedObjectWriter;
    private final EngineSnapshotTaker engineSnapshotTaker;
    private final OrderBookSnapshotTaker orderBookSnapshotTaker;
    private final List<EngineListener> engineListeners;

这将导致Lombok生成一个具有18个参数的构造函数。当Spring创建Bootstrap类的示例时,每个参数都将被Spring注入。
在我看来,如果你正在学习Java,你可能想看看一个不同的代码库。一个有18个构造函数参数的类非常复杂,有些人会认为它需要被分成一些更小、更易于管理的类。你可能也想避免使用Lombok,至少在你理解它为你生成的代码是什么样子之前。

相关问题