AOP学习笔记一
软件开发的目的是为了解决各种需求,包括业务需求和系统需求。目前,业界通过使用面向对象的编程思想,已经可以对业务需求等普通关注点进行很好的抽象与封装,并且使之模块化。但是对于系统需求一类的关注点来说,情况却有所不同。对于业务需求而言,需求与其具体实现之间的关系基本上是一对一的。我们可以在系统中的某一个确定的点找到针对需求的实现,无论是开发还是维护,都比较方便。但是系统需求,比如记录日志、事务管理等系统需求,它们往往在系统的各处散落。我们需要找到一种更好的方式来解决这类系统需求,这种软件开发模式就是面向切面编程,也就是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学习笔记一的更多相关文章
- Spring入门IOC和AOP学习笔记
Spring入门IOC和AOP学习笔记 概述 Spring框架的核心有两个: Spring容器作为超级大工厂,负责管理.创建所有的Java对象,这些Java对象被称为Bean. Spring容器管理容 ...
- Aop学习笔记
在学习编程这段时间我想大家都是习惯了面向过程或者面向对象的思想来编程,较少或者没有接触过面向方面编程的思想. 那么什么是面向方面(Aspect)——其实就是与核心业务处理逻辑无关的切面,例如记录日志. ...
- Spring AOP学习笔记01:AOP概述
1. AOP概述 软件开发一直在寻求更加高效.更易维护甚至更易扩展的方式.为了提高开发效率,我们对开发使用的语言进行抽象,走过了从汇编时代到现在各种高级语言繁盛之时期:为了便于维护和扩展,我们对某些相 ...
- Spring AOP学习笔记02:如何开启AOP
上文简要总结了一些AOP的基本概念,并在此基础上叙述了Spring AOP的基本原理,并且辅以一个简单例子帮助理解.从本文开始,我们要开始深入到源码层面来一探Spring AOP魔法的原理了. 要使用 ...
- Spring AOP学习笔记03:AOP的核心实现之获取增强器
上文讲了spring是如何开启AOP的,简单点说就是将AnnotationAwareAspectJAutoProxyCreator这个类注册到容器中,因为这个类最终实现了BeanPostProcess ...
- Spring AOP学习笔记05:AOP失效的罪因
前面的文章中我们介绍了Spring AOP的简单使用,并从源码的角度学习了其底层的实现原理,有了这些基础之后,本文来讨论一下Spring AOP失效的问题,这个问题可能我们在平时工作中或多或少也会碰到 ...
- AOP 学习笔记
代理是一个设计模式,提供了对目标对象另外的访问方式:即通过代理访问目标对象. 好处:可以在目标对象实现的基础上,增强额外的功能操作. Cglib 代理,也叫作 子类代理. JDK的动态代理有一个限制, ...
- AOP学习笔记二
Spring AOP采用Java作为AOP的实现语言(AOL),学习曲线平滑,Spring AOP对AspectJ也提供了很好的集成与支持.最为第二代的AOP,采用动态代理机制和字节码生产技术实现,在 ...
- Spring AOP学习笔记
Spring提供了一站式解决方案: 1) Spring Core spring的核心功能: IOC容器, 解决对象创建及依赖关系 2) Spring Web ...
随机推荐
- show_you_my_codes 001
program 001 第 0001 题:做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券), 使用 Python 如何生成 200 个激活码(或者优 ...
- Protege5.0.0入门学习
OWL本体的重要组成部分 Individuals:个体,代表一个领域里面的对象.可以理解成一个类的实例(instances of classes). Properties:属性,是两个个体之间的双重联 ...
- 每天一个linux命令(33)--df命令
周末是学习的好时光. 每天一个Linux命令,接下来是磁盘存储相关的,df, du命令 Linux中 df 命令的功能是用来检查Linux 服务器的文件系统的磁盘空间占用情况.可以利用该命令来获取硬 ...
- mfc--使用ShellExecute打开另一个可执行程序
ShellExecute(sFile [, vArguments] [, vDirectory] [, vOperation] [, vShow]) ShellExecute(NULL,"o ...
- Java日志工具之SLF4J
SLF4J全称为Simple Logging Facade for Java (简单日志门面),作为各种日志框架的简单门面或者抽象,包括 java.util.logging, log4j, logba ...
- BOM基础(二)
跟DOM一样,BOM其实也是由很多的API组成. 不过对于BOM来说,最痛苦的不是不记得API,而是明明记得这个这个API,却没有考虑到它的兼容性. 之前的文章中讲到了offset系列的属性,他的宽高 ...
- Gradle之恋-命令行详解
虽然很多童鞋都必须要用IDE,但有些命令是IDE很难表现出来的,还是命令行返璞归真.本文就带你来剖析Gradle的命令行. 本文不包括试验性(incubating)的选项,如--configure-o ...
- 动态规划略有所得 数字三角形(POJ1163)
在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大.路径上的每一步都只能往左下或 右下走.只需要求出这个最大和即可,不必给出具体路径. 三角形的行数大于1小于等于100,数 ...
- 第一章 开发简单Java应用程序
1. 什么是程序? 程序一词来自生活,通常指完成某些事务的一种既定方式和过程(一组有序指令的集合). 2. Java的三个领域? Java SE:java技术核心(指桌面应用程序)如:QQ.百 ...
- 适用MySQL Migration Toolkit 1.0 将oracle迁移到mysql中遇到的问题
这里主要说一下我在适用中碰到的问题,主要过程参考 http://www.cnblogs.com/duwenlei/p/3520759.html. 首先启动MySQLMigrationTool.exe ...