所谓trait就是可以包含实现的接口。它类似于C++中多继承的概念,但却没有众所周知的diamond syndrome副作用。通过将DAO代码封装到trait中,该DAO trait所提供的所有持久化方法可自动为所有实现类所用。这种方式完美地诠释了DRY(Don’t Repeat Yourself)准则,因为持久化逻辑只实现一次,在需要的时候可以多次混合到领域类中。
对于该示例应用来说,其DAO trait如下代码所示:
|
作为一个传统的DAO,该trait继承了Spring的JpaDaoSupport,但它并没有提供save、update和delete方法(这些方法需要接收一个实体作为参数)转而定义了一个抽象方法getEntity,需要持久化功能的领域对象得实现这个方法。JpaPersistable trait在内部实现中使用getEntity来保存、更新和删除特定的实体,如下代码片段所示。
|
实现该trait的领域对象只需实现getEntity方法即可,该方法的实现仅仅是返回一个自身引用:
|
这就是全部了。所有需要持久化行为的领域对象只需实现JpaPersistable trait即可。最后我们得到的是一个包含了状态和行为功能完善的领域对象,完全符合纯粹的OO编程的理念:
Person(“Martin Odersky”).save |
无论你是否为纯粹的OO理念的拥护者,这个示例都阐释了Scala(尤其是traits概念)是如何轻松实现纯粹的OO设计的。
结论
本文示例介绍了Scala与Spring是如何实现互补的。Scala简明、强大的范式(比如函数与特征)再结合Spring的依赖注入、AOP和Java AP为我们I提供了更广阔的空间,相对于Java代码来说,Scala的实现更具表现力、代码量也更少。
如果具有Spring和Java基础,Scala的学习曲线非常低,因为我们只需要学习一门新语言就行,无需再学大量的API了。
Scala和Spring所提供的众多功能使得这一组合成为企业采用Scala的最佳选择。总之,我们能以极低的代价迁移到更加强大的编程范式上来。