学习 Guice(二):Spark 依赖注入实践

绑定

class ApplicationModule(spark: SparkSession, date: LocalDate) extends AbstractModule {

  override def configure(): Unit = {
    bind(classOf[SparkSession]).toInstance(spark) // ①

    bind(classOf[Source]).to(classOf[SourceImpl]) // ②
    bind(classOf[Sink]).to(classOf[SinkImpl])
  }

}

① 绑定 SparkSession 实例到 SparkSession 类

② 绑定 SourceImpl 实现类到 Source 接口,绑定 SinkImpl 实现类到 Sink 接口

定义接口与实现

接口定义举🌰:

trait Source {

  def userDF: DataFrame

}

实现类举🌰:

class SourceImpl @Inject()(spark: SparkSession) extends Source { // 注入 SparkSession 实例

  override def userDF: DataFrame = {
    spark.table("dw.user")
  }

}

应用入口

val injector = Guice.createInjector(new ApplicationModule(spark)) // ①  
injector.getInstance(classOf[Application]).run() // ②  

① 创建 Injector 实例

② 运行

👇 是应用程序的骨架:

class Application @Inject() (spark: SparkSession) {

  @Inject
  var source: Source = _

  @Inject
  var sink: Sink = _

  def run(): Unit = {
    // 处理逻辑
  }

}