软件开发的目的是为了解决各种需求,包括业务需求和系统需求。目前,业界通过使用面向对象的编程思想,已经可以对业务需求等普通关注点进行很好的抽象与封装,并且使之模块化。但是对于系统需求一类的关注点来说,情况却有所不同。对于业务需求而言,需求与其具体实现之间的关系基本上是一对一的。我们可以在系统中的某一个确定的点找到针对需求的实现,无论是开发还是维护,都比较方便。但是系统需求,比如记录日志、事务管理等系统需求,它们往往在系统的各处散落。我们需要找到一种更好的方式来解决这类系统需求,这种软件开发模式就是面向切面编程,也就是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. Tomcat 实现热部署

      热部署概念   热部署是指在你对JSP或JAVA类进行了修改在不重启WEB服务器前提下能让修改生效,配置文件的修改除外     热部署好处   每次打增量包的时候就不用重新启动tomcat了   ...

  2. 每天一个Linux命令(08)--cp命令

    cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一.一般情况下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不管你是否使用-i参数.但是如果是 ...

  3. VUE2.0实现购物车和地址选配功能学习第六节

    第六节 地址列表过滤和展开所有的地址 html:<li v-for="(item,index) in filterAddress">js: new Vue({ el:' ...

  4. Sublime Text 3 (Build 3126) 最新注册码

    Sublime Text 作为程序员开发神器,听说最新版更新了 并且增加了不少新特性.马上到官网下载了最新版 Sublime Text 3 3126 使用了下,反应速度比以前的确更快了.随手找了几个S ...

  5. 裸机(Bare Metal)安装CoreOS

    本文以 1235.9.0-stable 为例,在WMWare中进行安装. 1.获取安装资源 https://coreos.com/releases/ 通过"Browse Images&quo ...

  6. 读阮一峰对《javascript语言精粹》的笔记,我有疑问。

    <javascript语言精粹>是一本很棒的书籍,其中作者在附录列出了12种他所认为的javascript语言中的糟粕. 我最近开始跟读前端前辈的博客,其中读到了阮一峰的<12种不宜 ...

  7. 理解margin负值

    效果 上和左方的margin负值使元素向上和左方向移动,如果该元素position不是absolute或fixed,这还会导致之后的元素也向上,左移 下和右方的margin负值会缩小下和右方的空间,使 ...

  8. 使用postfix在debian上配置邮件服务器

    如果debian中安装了exim4,先卸载exim4: apt-get remove exim4 安装postfix apt-get install postfix 安装完成后就可以测试下,PHP代码 ...

  9. 用stm32f0x建立新的工程重要步骤

    stm32f10x系列新建空的工程主要原理: 1.添加启动文件 不同的芯片类型的启动文件的容量是不同的,选择适合该芯片的容量作为启动文件. 注意:启动文件是汇编语言编写的,所以文件的后缀名为.s 2. ...

  10. node.js异步控制流程 回调,事件,promise和async/await

    写这个问题是因为最近看到一些初学者用回调用的不亦乐乎,最后代码左调来又调去很不直观. 首先上结论:推荐使用async/await或者co/yield,其次是promise,再次是事件,回调不要使用. ...