AOP 简介与作用
AOP
Aspect Oriented Programming(AOP)是较为热门的一个话题。AOP,国内大抵译作“面向切面编程”。
- “面向切面编程”, 这样的名字并不是非常容易了解,且容易产生一些误导。
- 笔者不止一次听到相似“OOP/OOD11 行将掉队,AOP 是新一代软件开发形式”这样的发言。而在 AOP 中,Aspect 的含意,可能更多的了解为“切面”比拟适合。所以笔者更偏向于“面向切面编程”的译法。能够通过预编译形式和运行期动静代理实现在不批改源代码的状况下给程序动静对立增加性能的一种技术。
- AOP 理论是 GoF 设计模式的连续,设计模式手不释卷谋求的是调用者和被调用者之间的解耦, 进步代码的灵活性和可扩展性,AOP 能够说也是这种指标的一种实现。
利用对象只实现它们应该做的——实现业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的零碎级关注点,例如日志或事务反对。
AOP 次要性能
日志记录,性能统计,安全控制,事务处理,异样解决等等 wn 及扩大
AOP 次要用意
将日志记录,性能统计,安全控制,事务处理,异样解决等代码从业务逻辑代码中划分进去,通过对这些行为的拆散,咱们心愿能够将它们独立到非领导业务逻辑的办法中,进而扭转这些行为的时候不影响业务逻辑的代码。arkdown Extra** 定义列表语法:
代码块
假如在一个利用零碎中,有一个共享的数据必须被并发同时拜访,首先,将这个数据封装在数据对象中,称为 Data Class,同时,将有多个拜访类,专门用于在同一时刻拜访这同一个数据对象。
为了实现上述并发拜访同一资源的性能,须要引入锁 Lock 的概念,也就是说,某个时刻,当有一个拜访类拜访这个数据对象时,这个数据对象必须上锁 Locked,用完后就立刻解锁 unLocked,再供其它拜访类拜访。
应用传统的编程习惯,咱们会创立一个抽象类,所有的拜访类继承这个形象父类,如下:
abstract class Worker {
abstract void locked();
abstract void accessDataObject();
abstract void unlocked();
}
accessDataObject()办法须要有“锁”状态之类的相干代码。
Java 只提供了单继承,因而具体拜访类只能继承这个父类,如果具体拜访类还要继承其它父类,比方另外一个如 Worker 的父类,将无奈不便实现。
重用被打折扣,具体拜访类因为也蕴含“锁”状态之类的相干代码,只能被重用在相干有“锁”的场合,重用范畴很窄。
认真钻研这个利用的“锁”,它其实有下列个性:
“锁”性能不是具体拜访类的首要或次要性能,拜访类次要性能是拜访数据对象,例如读取数据或更改动作。
“锁”
“锁”性能其实是这个零碎的一个纵向切面,波及许多类、许多类的办法。如上图:
` 因而,一个新的程序结构应该是关注零碎的纵向切面,例如这个利用的“锁”性能,这个新的程序结构就是 aspect(方面)在这个利用中,“锁”方面(aspect)应该有以下职责:`
* 1
* 2
提供一些必备的性能,对被拜访对象实现加锁或解锁性能。以保障所有在批改数据对象的操作之前可能调用 lock()加锁,在它应用实现后,调用 unlock()解锁。
AOP 利用范畴
很显著,AOP 非常适合开发 J2EE 容器服务器,JBoss 4.0 正是应用 AOP 框架进行开发。
具体性能如下:
Authentication 权限
Caching 缓存
Context passing 内容传递
Error handling 错误处理
Lazy loading 延时加载
Debugging 调试
logging, tracing, profiling and monitoring 记录跟踪 优化 校准
Performance optimization 性能优化
Persistence 长久化
Resource pooling 资源池
Synchronization 同步
Transactions 事务
【AOP 有必要吗?】
` 当然,上述利用范例在没有应用 AOP 状况下,也失去了解决,例如 JBoss 3.XXX 也提供了上述利用性能,并且没有应用 AOP。然而,应用 AOP 能够让咱们从一个更高的抽象概念来了解软件系统,AOP 兴许提供一种有价值的工具。能够这么说:因为应用 AOP 构造,JBoss 4.0 的源码要比 JBoss 3.X 容易了解多了,这对于一个大型简单零碎来说是十分重要的。从另外一个方面说,如同不是所有的人都须要关怀 AOP,它可能是一种架构设计的抉择,如果抉择 J2EE 零碎,AOP 关注的上述通用方面都曾经被 J2EE 容器实现了,J2EE 利用零碎开发者可能须要更多地关注行业利用方面 aspect。传统的程序通常体现出一些不能天然地适宜繁多的程序模块或者是几个严密相干的程序模块的行为,AOP 将这种行为称为横切,它们逾越了给定编程模型中的典型职责界线。横切行为的实现都是扩散的,软件设计师会发现这种行为难以用失常的逻辑来思考、实现和更改。最常见的一些横切行为如上面这些:`
* 1
* 2
* 3
* 4
* 5
* 6
* 7
1、日志记录,跟踪,优化和监控
2、事务的解决
3、长久化
4、性能的优化
5、资源池,如数据库连接池的治理
6、零碎对立的认证、权限治理等
7、利用零碎的异样捕获及解决
8、针对具体行业利用的横切行为
` 后面几种横切行为都曾经失去了亲密的关注,也呈现了各种有价值的利用,但兴许今后几年,AOP 对针对具体行业利用的奉献会成为令人关注的焦点。`
* 1
AOP 实现我的项目
AOP 是一个概念,并没有设定具体语言的实现,它能克服那些只有单继承个性语言的毛病(如 Java),AOP 具体实现有以下几个我的项目:
→AspectJ (TM):创立于 Xerox PARC. 有近十年历史,成熟;
→毛病:过于简单;毁坏封装;须要专门的 Java 编译器;
→动静 AOP:应用 JDK 的动静代理 API 或字节码 Bytecode 解决技术;
→基于动静代理 API 的具体我的项目有:
JBoss 4.0 JBoss 4.0 服务器;
→基于字节码的我的项目有:
aspectwerkz,spring。
AOP 作用
` 面向过程编程离咱们曾经有些边远,面向对象编程正主宰着软件世界。当每个新的软件设计师都被要求把握如何将需要性能转化成一个个类,并且定义它们的数据成员、行为,以及它们之间简单的关系的时候,面向切面编程(Aspect-Oriented Programming,AOP)为咱们带来了新的想法、新的思维、新的模式。如果说面向对象编程是关注将需要性能划分为不同的并且绝对独立,封装良好的类,并让它们有着属于本人的行为,依附继承和多态等来定义彼此的关系的话;那么面向切面编程则是心愿可能将通用需要性能从不相干的类当中分离出来,可能使得很多类共享一个行为,一旦发生变化,不用批改很多类,而只须要批改这个行为即可。面向切面编程是一个令人兴奋不已的新模式。就开发软件系统而言,它的影响力必将会和有着数十年利用历史的面向对象编程一样微小。面向切面编程和面向对象编程岂但不是相互竞争的技术而且彼此还是很好的互补。面向对象编程次要用于为同一对象档次的专用行为建模。它的弱点是将公共行为利用于多个无关对象模型之间。而这恰好是面向切面编程适宜的中央。有了 AOP,咱们能够定义穿插的关系,并将这些关系利用于跨模块的、彼此不同的对象模型。AOP 同时还能够让咱们层次化功能性而不是嵌入功能性,从而使得代码有更好的可读性和易于保护。它会和面向对象编程单干得很好。`
* 1
* 2
* 3
* 4
* 5
* 6
* 7
在 OOP 设计中,它导致了大量代码的反复,而不利于各个模块的重用。
1、面向切面编程(AOP)
面向切面编程(AOP)就是对软件系统不同关注点的拆散,开发者通过拦挡办法调用并在办法调用前后增加辅助代码。
AOP 利用一种称为“横切”的技术,剖解开封装的对象外部,并将那些影响了多了类的公共行为封装到一个可重用的模块,并将其命名为“Aspect”,即切面。
所谓“切面”,简略地说,就是将那些于业务无关,却为月舞模块所独特调用的逻辑或责任封装起来。
①切面就是横切面,代表的是一个普遍存在的共有性能。
②AOP 代表的是一个横向关系
③AOP 吧软件系统分为两个局部:外围关注点和横切关注点。
④业务前途的次要流程是外围关注点,与之关系不大的局部是横切关注点。
横切关注点的一个特点是,他们常常产生在外围关注点的多处,而各处都根本类似。比方权限认证、日志、事务处理。
2、AOP 的作用在与拆散零碎中各个关注点,将外围关注点和横切关注点拆散开来。
java 代码:
public class BusinessLogic{
public voidSomeOPration(){
// 日志记录;
// 权限验证;
DoSomething();
// 失误管制;
}
}
3、AOP 技术的实现
AOP 技术是建设在 JAVA 语言的反射机制与动静代理机制之上的。
业务逻辑组件在运行过程中,AOP 容器动态创建一个代理对象供使用者调用。该代理对象曾经按程序员的用意将切面胜利切入到指标办法的连接点上,从而切面的性能与业务逻辑的性能同时的以执行。
AOP 是一种编程概念,因而他并未绑定带任何特定的语言。事实上,他对所有独自的、垂直的合成式(AOP 通常被认为是横向合成)的语言(不仅是 OO 语言)都有帮忙。AOP 在不同语言都有实现(如 C ++,Smalltalk,C#,C,Java)。
4、拦截器的设计原理
Struts2.0 的拦截器的设计体现了一种编程的设计理念,即面向切面编程 AOP。
拦挡是 AOP 的一种实现策略,在 AOP 中某个办法或字段被拜访,能够进行拦挡,而后在其之前或其之后退出某些操作。
5、什么是拦截器(Interceptor)?
拦截器是动静拦挡 Action 调用的对象。他提供了中机制是开发者能够在一个 Action 执行之前或执行之后插入须要的代码。
6、了解 DRY(Don’t Repeat Yourself)规定
在软件开发畛域,有一个十分重要的规定:Don’t Repeat Yourself,就是所谓的 DRY 规定,意思就是不要写反复代码。
为什么要应用办法调用呢?而不是在三个中央应用反复的代码呢?
很多初学者认为是为了编程的简略,代码简洁。实际上,这是主要的,最重要的起因是为了软件前期的降级及保护。
7、拦截器的意义
拦截器是对调用办法的改良。咱们说某个实例是一个拦截器时,这是从行为上来说的,如果从代码的角度来看,拦截器也是一个类,类中蕴含有办法,常识这个办法比拟非凡,他会在指标办法调用之前“主动”执行。
进一步改良,如下:
作用:(1)提供可更高层次的解耦
(2)容许扭转被调用办法的办法体
(3)能够扭转调用的指标办法
8、实现原理
如何主动的调用拦截器,而且晓得到底调用呢个拦截器的办法?大部分的时候,拦截器办法都是通过 JDK 的动静代理来调用的,AOP 的实现机制。
9、拦截器在 Struts2.0 中的角色
作用:(1)拦截器是通过 struts.xml 文件配置的,从而实现了对 Action 通用操作的可插拨式治理。
(2)升高了 Action 与特定代码的耦合性
(3)进步了 ACtion 的复用性
(4)吧多个 Action 中须要反复指定的代码取出,放在拦截器类中定义,从而提供更好地代码重用。
10、Struts2 中的拦截器
在 Struts2 中曾经在 struts-default.xml 中预约义了一些自带的拦截器,如 timer、params 等。
如果在 struts.xml 中配置标签中继承 struts-default,则以后 package 就会主动领有 struts-default.xml 中的所有配置。代码如下:
11、拦截器的定义
在 struts.xml 文件中定义拦截器语法格局:
12、利用定义好的拦截器
在 struts-default.xml 中有一个默认的援用,在默认状况下(也就是未援用拦截器时)会主动援用一些拦截器。
下面在 defaultStack 中援用的拦截器都能够不通过援用能够应用
留神:如果在援用了任何拦截器后,要应用在 defaultStack 中定义的拦截器,须要从新援用。
13、params 拦截器应用
当客户端的一个 form 想服务器端提交申请时,如有 textfield,代码如下:
在提交后,Struts2 将会主动调用 login 动作类中的 setXX 办法,并将文本框中的值通过 setXXX 办法的参数传入。
实际上,这个操作是由 params 拦截器实现的,params 对应的类是 com.opensymphony.xwork2.interception.Parameterslnterceptor.
因为 params 曾经在 defaultStack 中定义,因而,在未援用拦截器的是会主动援用 params 的。
如上面的配置代码,在拜访 login 动作时,Struts 是会主动执行相应的 setter 办法的。
这样,登陆表单中的用户名,明码参数就会在 Action 类中被 set 进去,实现登陆性能。
但如果在 action 中援用了其余拦截器,就必须显示的援用 params 拦截器,Struts2 不能调用相应的 setter 办法来初始化参数。如上面的配置代码所示:
咱们能够不去配置 params 拦截器,配置 timer 和 logger 或任意一个,测试参数 username、password 的值,应该是没有失去表单提交的值,因为 params 拦截器曾经不起作用了。
14、应用拦截器栈
为了能在多个动作中不便的援用同一个或几个拦截器,能够应用拦截器栈将这些拦截器当个整体来援用。
拦截器栈要在 package 标签中应用 interceptors 和子标签 interceptor-stack 来定能够像应用拦截器一样应用拦截器栈。