Java Guice中延迟加载的提供程序

Java Guice中延迟加载的提供程序,java,dependency-injection,lazy-loading,guice,Java,Dependency Injection,Lazy Loading,Guice,在中,我读了一篇关于延迟加载提供程序的文章。但是,我不明白为什么下面的代码意味着延迟创建提供者,因为我找不到任何注释或与延迟加载对应的代码。 代码就是这个代码 public class DatabaseTransactionLog implements TransactionLog { private final Provider<Connection> connectionProvider; @Inject public DatabaseTransactionLog

在中,我读了一篇关于延迟加载提供程序的文章。但是,我不明白为什么下面的代码意味着延迟创建提供者,因为我找不到任何注释或与延迟加载对应的代码。 代码就是这个代码

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();
    }
  }
公共类DatabaseTransactionLog实现TransactionLog{ 私人最终提供者连接提供者; @注入 公共数据库事务日志(提供程序连接提供程序){ this.connectionProvider=connectionProvider; } 公共作废日志ChargeResult(ChargeResult结果){ /*仅将失败的费用写入数据库*/ 如果(!result.wasuccessful()){ Connection=connectionProvider.get(); } }
在世界上哪里可以看到导致加载延迟的特殊点?

创建连接可能很昂贵,而且可能并不总是需要。因此,guice框架不允许在注入时创建连接,而是允许注入“提供者”,这将在
get()时创建依赖关系
方法被调用


延迟是以调用
provider.get()的方式出现的
,它相对于为每个依赖项调用构造函数的时间延迟。在您的示例中,
DatabaseTransactionLog
的构造函数会被调用,但此时不会创建任何连接。只有在调用方法
logChargeResult
时才会创建
连接(因为
provider.get()
调用了它)。

通常在满足依赖关系时,会创建所需的对象。对于提供程序,在调用
get()
之前,不会创建所需的对象,这可能要晚得多。