2017-02-12 16 views
1

В the official document, я прочитал статью о Провайдерах для ленивой загрузки. Однако я не могу понять, почему этот ниже код означает задержку создания провайдера, потому что я не могу найти какую-либо аннотацию или какой-либо код, который соответствует ленивой загрузке. И код - это код.Провайдеры для ленивых погрузчиков в Guice

public class DatabaseTransactionLog implements TransactionLog { 

    private final Provider<Connection> connectionProvider; 

    @Inject 
    public DatabaseTransactionLog(Provider<Connection> connectionProvider) { 
    this.connectionProvider = connectionProvider; 
    } 

    public void logChargeResult(ChargeResult result) { 
    /* only write failed charges to the database */ 
    if (!result.wasSuccessful()) { 
     Connection connection = connectionProvider.get(); 
    } 
    } 

Где мы видим в мире особую точку, которая вызывает задержку загрузки?

+0

Обычно, когда зависимость выполняется, создается необходимый объект. Для Провайдеров необходимый объект не создается до тех пор, пока не будет вызвано 'get()', что может быть намного позже. –

ответ

3

создание соединения может быть дорогостоящим, и оно может не понадобиться. Поэтому вместо того, чтобы создавать соединение во время инъекции, структура guice позволяет вводить «поставщика», который будет создавать зависимость при вызове метода get().

Задержка заключается в том, как вы вызываете provider.get(), и она задерживается относительно времени, когда конструкторы вызываются для каждой зависимости. В приведенном примере вызывается конструктор для DatabaseTransactionLog, но в то время соединение не создается. A Connection создается только тогда, когда вызывается метод logChargeResult (из-за вызова provider.get()).