scala-trait实现AOP编程
步骤1:声明表示基本动作方法的模块Taction
//声明表示基本动作方法的模块Taction
trait TAction {
def doAction
}
步骤2:定义一下加入了前置处理和后置处理的特征TBeforeAfter
trait TBeforeAfter extends TAction {
abstract override def doAction {
//doAction的前置处理
println("/entry before-action")
super.doAction
//doAction的后置处理
println("/exit after-action")
}
}
通过上面的abstract override def doAction {}语句来覆盖虚方法。具体来说这当中的super.doAction是关键,他调用了TAction的doAction方法。其原理是,由于doAction是虚方法,所以实际被执行的是被调用的实体类中所定义的方法。、
步骤3:实现实际执行的实体类RealAction
class RealAction extends TAction {
def doAction = {
println("** real action done!! **")
}
}
测试
object TestTrait {
def main(args : Array[String]) : Unit = {
val act1 = new RealAction with TBeforeAfter
act1.doAction
val act2 = new RealAction with TBeforeAfter with TTwiceAction
act2.doAction
val act3 = new RealAction with TTwiceAction with TBeforeAfter
act3.doAction
}
}
/entry before-action
** real action done!! **
/exit after-action
接着为他定义一下别的方面,然后将这些方面加入到同一对象的方法中。接着定义一个将源方法执行两遍的方面。
trait TTwiceAction extends TAction {
abstract override def doAction {
for (i <- 1 to 2){
super.doAction
println("==>NO. " + i)
}
}
}
下面,将TBeforeAfter和TtwiceAction混合在一起后执行一下。
/entry before-action
** real action done!! **
/exit after-action
==>NO. 1
/entry before-action
** real action done!! **
/exit after-action
==>NO. 2
伴随着原来方法的before/after动作一起各自执行了两次。接着将混入顺序颠倒后再试一下。
/entry before-action
** real action done!! **
==>NO. 1
** real action done!! **
==>NO. 2
/exit after-action
这样执行后,原来的实现方法被循环执行了两次,但是before/after则在循环以外整体只执行了一次。这是根据with语句定义的顺序来执行的,知道了这原理之后也就没有什么奇怪的了。Scala特性的如此混入顺序是和AspectJ的方面以及Spring的interceptor相同的。
scala-trait实现AOP编程的更多相关文章
- php-parser在Aop编程中的使用
在laravel下使用php-parser实现aop composer require nikic/php-parser Test.php <?php /** * Created by PhpS ...
- 【原】iOS动态性(三) Method Swizzling以及AOP编程:在运行时进行代码注入
概述 今天我们主要讨论iOS runtime中的一种黑色技术,称为Method Swizzling.字面上理解Method Swizzling可能比较晦涩难懂,毕竟不是中文,不过你可以理解为“移花接木 ...
- 使用spring方式来实现aop编程
1:什么是aop? Aspect Oriented Programming 面向切面编程 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译 ...
- Spring学习笔记之四----基于Annotation的Spring AOP编程
你能使用@Aspect annotation将某个Java类标注为Aspect,这个Aspect类里的所有公有方法都可以成为一个Advice,Spring提供了5个Annotation去将某个方法标注 ...
- 聊Javascript中的AOP编程
Duck punch 我们先不谈AOP编程,先从duck punch编程谈起. 如果你去wikipedia中查找duck punch,你查阅到的应该是monkey patch这个词条.根据解释,Mon ...
- 基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)--AOP编程
AOP编程在目前来说好像是大家都比较喜欢的.ASP.NET MVC中的Filter就是使用AOP实现的配置器模式.AOP在编码中的应用主要有如下几个方面: 日志记录,跟踪,优化和监控 事务的处理 持久 ...
- Scala Trait
Scala Trait 大多数的时候,Scala中的trait有点类似于Java中的interface.正如同java中的class可以implement多个interface,scala中的cals ...
- Scala 中的函数式编程基础(一)
主要来自 Scala 语言发明人 Martin Odersky 教授的 Coursera 课程 <Functional Programming Principles in Scala>. ...
- struts2.1笔记03:AOP编程和拦截器概念的简介
1.AOP编程 AOP编程,也叫面向切面编程(也叫面向方面):Aspect Oriented Programming(AOP),是目前软件开发中的一个热点,也是Spring框架中的一个重要内容.利用A ...
- Method Swizzling以及AOP编程:在运行时进行代码注入-备用
概述 今天我们主要讨论iOS runtime中的一种黑色技术,称为Method Swizzling.字面上理解Method Swizzling可能比较晦涩难懂,毕竟不是中文,不过你可以理解为“移花接木 ...
随机推荐
- Mac下Sublime Text 总是以新窗口打开文件的解决办法
Mac下的Sublime有个毛病,经常打开后,之前打开的窗口都没了,太难受了. Windows/Linux下的sublime总是默认的以标签页的形式打开关联的文件,但是在Mac下使用Sublime打开 ...
- [Backbone] Working with forms
Our first step is to add a template to the AppointmentForm below. Have the template produce a form w ...
- ubuntu环境下android开发环境安装
http://blog.csdn.net/shulianghan/article/details/38023959 Android程序开发的环境配置 Ubuntu下自带openjdk的卸载 你无需管它 ...
- 谈谈node(1)
node的出现,给了全栈工程师,一个绝佳的机会. node给我们带来的是更低的硬件成本来完成更高需求以及用户体验感,一台8G内存服务器如果用传统架构,那么最多可驱使4000台同时访问,如果 ...
- Hibernate(八)多对多映射
一.创建数据表 --学生证表 create table paper ( pid number primary key, pdesc ) , sid number references student( ...
- Servlet一(web基础学习笔记二十)
一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...
- Linux虚拟机下使用USB转串口线——配置minicom、以及screen的使用
转自:http://bbs.ednchina.com/BLOG_ARTICLE_637212.HTM 环境:Windows XP + (VMware Workstation - Linux) 1.确保 ...
- 全局安装 vue
通过npm命令安装vuejs在用 Vue.js 构建大型应用时推荐使用 NPM 安装,NPM 能很好地和诸如 Webpack 或Browserify 的 CommonJS 模块打包器配合使用.(以下操 ...
- 常见的前端UI框架
Bootstrap 首先说 Bootstrap,估计你也猜到会先说或者一定会有这个( 呵呵了 ),这是说明它的强大之处,拥有框架一壁江山的势气.自己刚入道的时候本着代码任何一个字母都得自己敲出来挡我者 ...
- html 语义化标签拾遗
1.del和ins标签 兼容性:浏览器全部支持 del:定义文档中已被删除的文本. ins:定义已经被插入文档中的文本. <!DOCTYPE html> <html lang=&qu ...