在我的创业过程中,我一直在广泛使用 Java + AspectJ。我很想切换到 Scala,但我有一个通用的设计模式,我不确定它是否是在 Scala 中实现的最佳方式。
我们的大量应用程序使用 AspectJ 切入点,使用注释作为标记。 这与 Python 的装饰器和 blogged about it here 非常相似。 .
我曾尝试在 Scala 中执行此技术,但遇到了 AspectJ + Scala 的问题. 即使我确实让它工作了,它看起来也不像 unScala。
我看到一些项目做了一些按名称调用的闭包魔术(我认为这就是他们正在做的)。
替换@Transaction 的示例:
transaction {
// code in here.
}
我不得不说,虽然我更喜欢注释,因为它看起来更具声明性。 声明式“装饰”代码块的 Scala 方法是什么?
最佳答案
顺便说一句,我正在 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 也不太可能相同或易于以通用形式表达。 在中间,有共同的横切关注事务管理和安全。从表面上看,它们看起来很像缓存。然而,我们在实践中发现,将这些功能应用于一个类的所有方法(具有通用子选择,例如具有公共(public)访问权限的方法)或所有类的所有方法都标有注释(例如 @Service ) 常见。如果是这样的话,AspectJ 方法最终会更优越,因为它提供了一种在更高级别应用功能的方法,而不是高阶函数。您不再需要用 transactional{} 或 secured{} 包围每个方法,类级注解就可以了。对于类似安全的问题,AspectJ 方法提供了一种更简单的方法来执行安全审计。
在频谱的另一端是横切关注点,例如跟踪、分析、监控、策略执行、审计、某些形式的并发控制(例如 Swing 的/SWT/Android UI 线程调度) , 等等。这些很适合被切入点选择(有和通常没有注释)。仅使用高阶函数很难以一致的方式完成相同的操作。
语义上有更多细微差别,但最重要的是,当您发现对每个方法进行注释以应用横切关注点时,高阶函数可能是更好的方法。对于其他人,将 Scala 与 AspectJ 结合使用可能会提供一致且紧凑的解决方案。
附注我最近没有在 Eclipse 中尝试过 AspectJ+Scala(因为 Eclipse 中的 Scala 最近才开始工作)。但是在 http://lampsvn.epfl.ch/trac/scala/ticket/4214 之后使用 Maven 的外部构建工作正常已修复。
关于java - Scala:围绕建议或 Python 装饰器实现 Java 的 AspectJ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6002418/
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我有一个涉及多台机器、消息队列和事务的问题。因此,例如用户点击网页,点击将消息发送到另一台机器,该机器将付款添加到用户的帐户。每秒可能有数千次点击。事务的所有方面都应该是容错的。我以前从未遇到过这样的事情,但一些阅读表明这是一个众所周知的问题。所以我的问题。我假设安全的方法是使用两阶段提交,但协议(protocol)是阻塞的,所以我不会获得所需的性能,我是否正确?我通常写Ruby,但似乎Redis之类的数据库和Rescue、RabbitMQ等消息队列系统对我的帮助不大——即使我实现某种两阶段提交,如果Redis崩溃,数据也会丢失,因为它本质上只是内存。所有这些让我开始关注erlang和
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/
HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候