大数据系列修炼-Scala课程57

大数据系列修炼-Scala课程57

核心内容:
1、Scala中的依赖注入Dependency Injection操作代码实战

1、Scala中的依赖注入Dependency Injection操作代码实战

1>所谓依赖,就是在写程序或者构建系统的时候,我们的程序或者系统往往是由不同的组件组装起来的,而不同的组件之间
存在着依赖的关系,所谓依赖的关系就是使用别人的组件,并在程序运行的时候被注册进来。
2>Scala中的依赖注入是通过自身类型(限制)的方式来完成的,表现为自身类型限定后,可以使用携带类中的属性和方法。
3>依赖注入是指依赖对象的创建,由第三方完成,而不是被依赖对象,我们将这种控制关系的转移,称为依赖注入或者控制反转。
4>在自身类型的限定当中,B的对象及子类必须要混入A特质
5>Auth类型本身是依赖于Logger类型的,所以Auth的子类必须既是Auth类型的,也是Logger类型的.

实例程序1:

trait Logger
{
   def log(msg:String):Unit  //特质当中含有一个抽象方法
}
trait Auth
{ self:Logger=> //Auth的对象及子类必须混入Logger特质

  def fun(str:String) = log(str)  //依赖注入的表现:使用携带类中的属性与方法
}
object DI extends Auth with Logger
{
  def log(msg:String) = println(msg)  //重写相应的方法
}
object App 
{    
   def main(args:Array[String]):Unit=      
   {       
       DI.fun("Spark")
   }
}

实例程序2:

trait A
{
   def fun(str:String) = println(str)
}
class B(val first:String)
{ self:A=>
  def g() = fun(first)  //自身类型限定后,可以使用携带类中的属性和方法
}
object App 
{    
   def main(args:Array[String]):Unit=      
   {       
       val bb = new B("Spark") with A
       bb.g() //Spark
   }
}

深度思考1:之前所讲的继承、with实际上可以看做是一种依赖的思想。同时本讲所讲的依赖注入可以看做是混入特质的第3种方式,前两种方式分别是类型定义以及对象创建的时候混入特质,具体见面向对象。
深度思考2:scala中的依赖注入的结果就是通过依赖注入这种机制,可以使现有的类使用携带类中的属性与方法,这种功能对于隐式转换同样可以完成,示例如下:

trait A
{
  def g() = println("11111")
}
class B
object B
{
  implicit def BtoA(str:B) = new A{

  }
}
object App2
{
  def main(args : Array[String]): Unit =
  {
     var bb = new B()
     bb.g()
  }
}

由此看来,scala中的隐式转换功能是非常强大的。
如有问题,欢迎留言!

你可能感兴趣的:(scala,大数据)