软件开发的目的是为了解决各种需求,包括业务需求和系统需求。目前,业界通过使用面向对象的编程思想,已经可以对业务需求等普通关注点进行很好的抽象与封装,并且使之模块化。但是对于系统需求一类的关注点来说,情况却有所不同。对于业务需求而言,需求与其具体实现之间的关系基本上是一对一的。我们可以在系统中的某一个确定的点找到针对需求的实现,无论是开发还是维护,都比较方便。但是系统需求,比如记录日志、事务管理等系统需求,它们往往在系统的各处散落。我们需要找到一种更好的方式来解决这类系统需求,这种软件开发模式就是面向切面编程,也就是AOP。
我们可以发现,任何一个软件系统,其中的日志记录、安全检查、事务管理等系统需求就像一把刀,横切到我们系统中各个业务功能模块之上。在AOP的行话中,这些系统需求是系统中的横切关注点。在AOP中,是使用Aspect的概念来对横切关注点进行封装。Aspect至于AOP,就相当于Class至于OOP。我们应该明白,AOP仅仅是OOP方法的一种补足,但我们把以Class形式模块化的业务需求和以Aspect形式模块化的系统需求拼接转到一起的时候,整个系统功能就完整了。


在对整个系统进行分析之后,我们可以将不同的需求实现为Aspect类型和Class类型的两种积木,他们拼装到一起才能组成一个功能完整的系统。但是两个积木空间并不是等同的,限于当前的技术,Aspect积木空间不能独立构建,AOP没有主权,现有的AOP实现都需要“寄生”于OOP的主权领土上。AOP作为一种概念,同样需要实现方式,AOP也需要某种语言帮助实现相应的概念实体,我们统称这些实现AOP的语言为AOL。AOL可以与系统实现语言一致,比如JAVA,也可以是自己的语言,比如AspectJ等。AOL实现的AOP各个概念实体,最终都要以某种模式集成到系统实现语言所实现的OOP实体组件中。把AOP组件集成到OOP组件的过程,在AOP中称之为织入过程。
AOP的发展进程可以简单地分成两代:第一代是静态AOP时代,相应的横切关注点以Aspect形式实现之后,通过特定编译器将Aspect编译并织入到系统的静态类中;第二代是动态AOP时代,通过使用Java语言提供的各种动态特性来实现Aspect织入到当前系统的过程。在Java平台上,AOP发展到今天,主要使用的AOP实现机制有:
+ 动态代理
+ 动态字节码增强
+ Java代码生成
+ 自定义类加载器
+ AOL扩展
可以看到这五种实现AOP的方式,其中有些已经过时,他们之间的优缺点可以根据本身的机制推导出来。                AOP作为一种编程思想的概念,其中包含有较多的细节概念,在深入学习AOP实现之前,我们必须先熟悉熟悉。
+ Joinpoint 可以进行织入的系统执行点
+ Pointcut Joinpoint的表达方式(直接指定方法名称、正则表达式、特定Pointcut表述语言)
+ Advice 单一横切关注点逻辑的载体,代表将会织入到Joinpoint的横切逻辑(Before Advice、After Advice(After returning、After throwing、After Finally)、Around Advice、Introduction
+ Aspect 对横切关注点逻辑进行模块化封装的AOP概念实体(可包含多个Pointcut以及相关Advice定义)
+ 织入和织入器 只有经过织入,以Aspect模块化的横切关注点才会集成到OOP现存系统中。(AspectJ使用专门编辑器ajc、JBoss AOP使用自定义类加载器、Spring AOP使用一组类,最常用ProxyFactory)
+ 目标对象 符合Pointcut所指条件,将被织入横切逻辑的对象   

AOP是近年来流行起来的一种软件开发模式,本文都Java平台上的各种AOP框架及产品的实现原理和方式进行了简单地剖析,希望对理解AOP的现状有一个总体的认识。

AOP学习笔记一的更多相关文章

  1. Spring入门IOC和AOP学习笔记

    Spring入门IOC和AOP学习笔记 概述 Spring框架的核心有两个: Spring容器作为超级大工厂,负责管理.创建所有的Java对象,这些Java对象被称为Bean. Spring容器管理容 ...

  2. Aop学习笔记

    在学习编程这段时间我想大家都是习惯了面向过程或者面向对象的思想来编程,较少或者没有接触过面向方面编程的思想. 那么什么是面向方面(Aspect)——其实就是与核心业务处理逻辑无关的切面,例如记录日志. ...

  3. Spring AOP学习笔记01:AOP概述

    1. AOP概述 软件开发一直在寻求更加高效.更易维护甚至更易扩展的方式.为了提高开发效率,我们对开发使用的语言进行抽象,走过了从汇编时代到现在各种高级语言繁盛之时期:为了便于维护和扩展,我们对某些相 ...

  4. Spring AOP学习笔记02:如何开启AOP

    上文简要总结了一些AOP的基本概念,并在此基础上叙述了Spring AOP的基本原理,并且辅以一个简单例子帮助理解.从本文开始,我们要开始深入到源码层面来一探Spring AOP魔法的原理了. 要使用 ...

  5. Spring AOP学习笔记03:AOP的核心实现之获取增强器

    上文讲了spring是如何开启AOP的,简单点说就是将AnnotationAwareAspectJAutoProxyCreator这个类注册到容器中,因为这个类最终实现了BeanPostProcess ...

  6. Spring AOP学习笔记05:AOP失效的罪因

    前面的文章中我们介绍了Spring AOP的简单使用,并从源码的角度学习了其底层的实现原理,有了这些基础之后,本文来讨论一下Spring AOP失效的问题,这个问题可能我们在平时工作中或多或少也会碰到 ...

  7. AOP 学习笔记

    代理是一个设计模式,提供了对目标对象另外的访问方式:即通过代理访问目标对象. 好处:可以在目标对象实现的基础上,增强额外的功能操作. Cglib 代理,也叫作 子类代理. JDK的动态代理有一个限制, ...

  8. AOP学习笔记二

    Spring AOP采用Java作为AOP的实现语言(AOL),学习曲线平滑,Spring AOP对AspectJ也提供了很好的集成与支持.最为第二代的AOP,采用动态代理机制和字节码生产技术实现,在 ...

  9. Spring AOP学习笔记

      Spring提供了一站式解决方案:          1) Spring Core  spring的核心功能: IOC容器, 解决对象创建及依赖关系          2) Spring Web ...

随机推荐

  1. shell 获取指定目录下文件名

    有两个目录a.b,两个文件夹目录里有一些文件的文件名是一样,不过后缀名不同,我想把a文件夹下跟b文件夹里相同文件名的文件覆盖到b去,并删除b里同名而不同后缀的文件,文件很多    #!/bin/bas ...

  2. rpm的用法

    rpm是由红帽公司开发的软件包管理方式,使用rpm我们可以方便的进行软件的安装.查询.卸载.升级等工作.但是rpm软件包之间的依赖性问题往往会很繁琐,尤其是软件由多个rpm包组成时. yum基於RPM ...

  3. Hibernate一对一外键映射

    Hibernate 一对一外键映射                    ------------------------------                            ----- ...

  4. JavaScript的连续赋值的思考

    下面是一个连续赋值的例子: 在这里面,先创建a对象并添加n:1,然后将a对象赋值给b,这时候a和b引用同一个对象.最后我们要着重理解这最后一行代码 a.x = a = {n:2}; 按照我们平常的思维 ...

  5. SQLServer索引循环删除

    declare qc_cursor cursor SCROLL OPTIMISTIC Forselect siteName from tb_vhostcheckopen qc_cursordeclar ...

  6. 如何理解jQuery中的ajaxSubmit方法

    版权声明:本文为博主原创文章,转载请标注:www.cnblogs.com/gdsblog 刚刚学习中,使用到了ajaxSubmit,犹豫以前没有接触㢧这个,所以刚开始是一脸懵逼状态,最后通过查找资料的 ...

  7. ACM 阶乘数位数

    描述 N!阶乘是一个非常大的数,大家都知道计算公式是N!=N*(N-1)······*2*1.现在你的任务是计算出N!的位数有多少(十进制)?   输入 首行输入n,表示有多少组测试数据(n<1 ...

  8. SPM HW1 A project

    项目分析 --民航航班异常轨迹可视分析 最近完成的一个项目是一个可视化大作业--民航航班异常轨迹可视分析.要求利用已给的8G飞机的飞行记录数据,将飞机的飞行轨迹在浏览器中进行飞行轨迹高维可视化以及对异 ...

  9. Jmeter正则提取器常用的几种方式

    使用jmeter的同学都知道,jmeter提供了各种各样的提取器,如jsonpath.Beanshell.Xpath.正则等!!! 我们就针对正则提取器如何使用进行说明. 举例说明:假设取sessio ...

  10. .进程&线程(&java.lang.Thread)详解

    一.进程与线程 进程 我们在进行操作电脑的时候,通常会打开浏览器,通讯工具等应用程序,这个时候CPU通过作业调度在内存中就会分配一些空间让它们处于宏观上的运行状态(处于可以被CPU执行的状态),而这部 ...