Scala整合Spring框架

  • Scala整合Spring框架

  • 本文将介绍如何通过将优秀的编程语言Scala整合当今世界最为流行的框架Spring中。为了清楚地阐释Scala与Spring的整合原理,本文将使用一个简单的示例应用。

Scala近期正式发布了2.8版本,这门优秀的编程语言将简洁、清晰的语法与面向对象和函数式编程范式无缝融合起来,同时又完全兼容于Java,这样Scala就能使用Java开发者所熟知的Java API和众多的框架了。在这种情况下,我们可以通过Scala改进并简化现有的Java框架。此外,Scala的学习门槛也非常低,因为我们可以轻松将其集成到“众所周知的Java世界中”。

本文将介绍如何通过Scala整合当今世界最为流行的框架之一Spring。Spring不仅支持如依赖注入和面向方面的编程等高效的编程范式,还提供了大量的胶水代码与Hibernate、Toplink等框架以及JEE环境交互,后者更是可以保证Scala能平滑地融入到企业当中,毫无疑问,这是Spring的成功所在。

为了清楚地阐释Scala与Spring的整合原理,本文将使用一个简单的示例应用。这个应用会使用到Scala、Spring和Hibernate/JPA,其领域模型如下图所示:

该领域模型展示了一个简化的社交网络应用:人与人之间可以彼此链接起来。

第一步

后面的讲解都将基于该领域模型。首先介绍如何实现一个泛型DAO,并通过Hibernate/JPA使用Scala为Person实体实现一个具体的DAO,该DAO的名字为PersonDao,里面封装了CRUD操作。如下所示:

val p1 = new Person(“Rod Johnson”)   
val p2 = dao.findByName(“Martin Odersky”)   
p1.link(p2)  
personDao.save(p1) 

第二步

接下来介绍如何将Person实体转换为一个“内容丰富”的领域对象,在调用link方法时,该对象内部会使用NotificationService执行额外的逻辑,这个服务会“神奇地”按需注入到对象中。下图展示了这一切:

val p1 = Person(“Martin Odersky”) //the omission of the ‘new’ keyword is intentional   
val p2 = dao.findByName(“Rod Johnson”)   
p1.link(p2) //magic happens here  
personDao.save(p1)  

第三步

最后,本文将介绍Spring是如何从Scala的高级概念:特征(traits)中受益的。特征可以将内容丰富的Person领域对象转换为羽翼丰满的OO类,这个类能够实现所有的职责,包括CRUD操作。如下所示:

 
  1. Person(“Martin Odersky”).save   

第一步:使用Scala、Spring和Hibernate/JPA实现DAO

需求

毫无疑问,DAO在设计上应该有一个泛型DAO和一个针对Person实体的具体DAO。泛型DAO中应该包含基本的CRUD方法,如save、remove、findById和findAll等。由于是泛型,因此它处理的是类型而不是具体的实体实现。总的来说,这个泛型DAO具有如下的接口定义:

trait GenericDao[T] {  
      def findAll():List[T]  
      def save(entity:T):T   
      def remove(entity:T):Unit  
      def findById(id:Serializable):T  
} 

Person实体类的具体DAO应该增加一个特定于Person实体的finder方法:

trait PersonDao extends GenericDao[Person] {  
  def findByName(name:String):List[Person]  
  //more finders here…  
}  

我们需要考虑如下具体的实现细节以便利用上Scala提供的众多富有成效的特性:

◆关于集合:虽然底层的JPA实现并不知道所谓的Scala集合,但DAO接口返回的却是Scala集合类型(scala.List)而不是Java集合。因为Scala集合要比Java集合强大的多,因此DAO方法的调用者非常希望方法能够返回Scala集合。这样,我们需要将JPA返回的Java集合平滑地转换为Scala集合。

◆关于回调:Spring用于粘合JPA、JMS等框架的大多数胶水代码都是基于模板模式,比如JpaTemplate、JmsTemplate等。虽然这些模板通过一些便捷的方法在一定程度上隐藏了底层框架的复杂性,但很多时候我们还是不可避免地要直接访问底层的实现类,如EntityManager、JmsSession等。在这种情况下,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值