Scala:围绕建议或Python装饰器实现Java的AspectJ
我一直在为我的创业公司广泛使用
Java AspectJ.我想切换到Scala,但我有一个共同的设计模式,我不确定完全是在Scala中实现的最佳方式.
我们的大量应用程序使用注释作为标记使用AspectJ切入点. 我曾尝试在Scala中使用此技术,但在AspectJ + Scala中遇到了问题. 我已经看到一些项目做了一些名称封闭魔术(我认为这就是他们正在做的事情). 替换@Transaction的示例: transaction { // code in here. } 我不得不说,虽然我更喜欢注释,因为它似乎更具说明性. 解决方法
顺便说一句,我在
Scala Days 2011 on the same topic发表演讲.核心思想与Kim和Dean的例子相同.然而,当谈到全方位的横切关注点时,相似性和差异变得更加细微.
在频谱的一端,没有真正横切的问题,如缓存.当宿主语言不支持高阶函数(例如,Java)时,将关注点作为一个方面实现变得有吸引力.例如,使用AspectJ和注释方法,您可以说: @Cacheable(keyScript="#account.id") public double getNetWorth(Account account) { ... expensive computation } 但是在Scala中使用高阶函数,您可以: def getNetWorth(account: Account) : Double = { cacheable(keyScript=account.id) { ... expensive computation } } Scala方法要好得多,因为: >缓存不太可能广泛适用.例如,类中的所有方法或包中所有类的所有公共方法都不可能是可缓存的.即使存在这种情况,keyScript也不可能以通用形式相同或易于表达. 在中间,常见的横切涉及事务管理和安全性.从表面上看,它们看起来很像缓存.但是,我们在实践中发现将这些功能应用于类的所有方法(具有通用子选择,例如具有公共访问权限的通用子选择)或所有使用注释(例如@Service)标记的类的所有方法都是常见的.如果是这种情况,AspectJ方法最终会变得更优越,因为它提供了一种在更高级别的函数中应用功能的方法.当类级注释完成时,您不再需要使用事务性{}或安全性{}来包围每个方法.对于类似安全性的问题,AspectJ方法允许更简单的方法来执行安全审核. 另一方面是横切关注点,例如跟踪,分析,监控,策略实施,审计,某些形式的并发控制(例如Swing的/ SWT / Android UI线程调度)等.这些都非常适合成为由切入点选择(通常没有注释).单独使用高阶函数以一致的方式执行相同操作非常困难. 有更多的语义细微差别,但最重要的是,当您发现注释每个方法以应用横切关注点时,高阶函数可能是更好的方法.对于其他人来说,将Scala与AspectJ一起使用可能会提供一致且紧凑的解决方案. 附:我最近没有在Eclipse中尝试过AspectJ Scala(因为Eclipse中的Scala最近才开始工作).但使用Maven的外部构建在http://lampsvn.epfl.ch/trac/scala/ticket/4214修复后运行良好. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |