首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

CgLib ,NCgLib 和AOP (之一)

广大关心编程前沿的程序员已经对AOP的感念耳熟能详了。无论是基于.NET的实现还是基于Java的实现都有很多开源的项目可供参考。 对AOP不了解的读者可以到我得AOP专栏,熟悉一下AOP的基本概念。     回顾AOP的历史可以看出,AOP并不是最近几年才冒出的“新”概念,据说历史可以追溯到施乐公司的一个实验室的项目。        从汇编语言,面向过程的编程,在到现在被广泛接受的OOP的编程思想,人们逐步抽象出对现实世界的描述。这每一步的进步,都使得我们对大规模的软件编程更容易控制和实现。     那么为什么到了现在AOP才受到业界广泛关注呢?     一方面OOP的编程思想相对成熟,也逐步显露出了其不能有效解决的领域,这部分需要新的思想来填充。另一方面就是程序语言的进步。     大家知道AOP的特点之一是Interception,就是拦截。比如在方法执行前,执行中,执行后动态插入一些额外的方法,典型的就是日志,权限和事务控制。     在基于虚拟机java 和 CLR 的.net 出现以前实现方法拦截,几乎不可能。 单单从Interception上说,珊瑚虫  和 木子版本的 QQ 就是一个 具有AOP特性的实现。大家有兴趣可以了解一下 珊瑚虫 或者 木子 版本的QQ的实现方式,可以说是呕心沥血,经历了无数次的重新启动和汇编测试,才实现了对QQ相关方法的拦截。     因为无论是java的字节代码,还是.net的伪编译,他们生成的都不是最终的机器代码,而是平台无关的代码,这些代码在具体执行的时候还需要翻译成机器代码才可以执行。中间语言的出现使我们对执行前的代码有了更多的控制。     正因为如此AOP的理论有了实现的可能,这个时候出现可谓水到渠成。     一般来讲AOP的实现有3种途径:     1 在编译成中间代码前就让代码具有AOP的特性,比如AspectWikez;     2 使用语言特性,从设计方法出发,实现AOP,比如基于Java 的动态代理实现AOP。(见我得南宁系列文章);     3 在中间代码运行时,动态修改中间代码,使其具有AOP特性。     上面3种方法的有缺点我认为有几下几点:     采用的一种方法,一般需要编译器的扩充支持,如同C编译器的出现代替汇编一样,需要长时间的验证其稳定性和效率。另外对于最终开发人员来说也需要学习这些编译器,或者新的语法指令完成这些功能,当然功能也最强大。     第2种方法,我认为是一种轻量级别的实现,比如Nanning 和 DynAOP 等,一般这样的实现需要在设计上下功夫。比如需要基于接口编程。对于已有的项目来说,改动量非常大。     第3种方法,介于1,2种方法之间。采用第3种方法实现AOP,不需要每个类都有一个接口,也没有什么编译器的更改。他的缺点是需要高超的编程技巧。正因为如此,才有很多项目用第3种方法包装后,给最终开发人员使用比如:Spring。     实际上Spring 的AOP实现种第1,2种方法都采用了。     我认为目前的项目种,大规模的采用AOP还不适合,一方面AOP还在发展之中,另一方面支持AOP的框架还没有被广泛的接受。     正因为如此我们不妨直接操作中间代码,在项目的一些关键地方实现一些AOP的特性。     那在Java的世界中可以用cglib,Javassist 等     在.net的世界中可以用ncglib。     下文我们来给出一些代码例子。     (待续)

04
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    spring aop实例讲解_java swing 教程

    Aspect Oriented Programming:面向切面编程 什么时候会出现面向切面编程的需求?按照软件重构的思想,如果多个类中出现重复的代码,就应该考虑定义一个共同的抽象类,将这些共同的代码提取到抽象类中,比如Teacher,Student都有username,那么就可以把username及相关的get、set方法抽取到SysUser中,这种情况,我们称为纵向抽取。 但是如果,我们的情况是以下情况,又该怎么办? 给所有的类方法添加性能检测,事务控制,该怎么抽取? PerformanceMonitor TransactionManager AOP就是希望将这些分散在各个业务逻辑代码中的相同代码,通过横向切割的方式抽取到一个独立的模块中,让业务逻辑类依然保存最初的单纯。

    02

    WPF NET5 Prism8.0的升级指南

    ​ 曾经我以学习的目的写了关于在.NET Core3.1使用Prism的系列文章.NET Core 3 WPF MVVM框架 Prism系列文章索引,也谢谢大家的支持,事实上当初的版本则是Prism7.2.0.1442(7.2)版本,而现在也发布了.NET5和最新的Prism8.0.0.1909(8.0)版本,因此同样的我想将之前的Prism Demo项目可以升级到最新,写这篇文章的目的是自己也能学习一番,而更多的是回答那些在我Prism系列文章下面留下的我认为可以拿来一讲一些问题,而有些问题我则是水平有限回答不了(真的不是不想回答)  然后我拿之前的Prism Demo项目,WPF从.NET Core3.1升级到.NET 5其实非常简单,无脑修改项目的TargetFramework为net5.0-windows就行了,但是当Prism7.2升级到Prism8.0,我发现build的时候报了很多错误,那么让我们来看看究竟Prism8.0更新了些啥

    04

    全新升级的AOP框架Dora.Interception[1]: 编程体验

    多年之前利用IL Emit写了一个名为Dora.Interception(github地址,觉得不错不妨给一颗星)的AOP框架。前几天利用Roslyn的Source Generator对自己为公司写的一个GraphQL框架进行改造,性能得到显著的提高,觉得类似的机制同样可以用在AOP框架上,实验证明这样的实现方式不仅仅极大地改善性能(包括执行耗时和GC内存分配),而且让很多的功能特性变得简单了很多。这并不是说IL Emit性能不好(其实恰好相反),而是因为这样的实现太复杂,面向IL编程比写汇编差不多。由于AOP拦截机制涉及的场景很多(比如异步等待、泛型类型和泛型方法、按地址传递参数等等),希望完全利用IL Emit高效地实现所有的功能特性确实很难,但是从C#代码的层面去考虑就简单多了。(拙著《ASP.NET Core 6框架揭秘》于日前上市,加入读者群享6折优惠)

    06

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券