面向切面编程(AOP)及其作用
在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中配置<package>标签中继承struts-default,则当前package就会自动拥有struts-default.xml中的所有配置。代码如下:
<package name="xxx" extends="struts-default" > ... </package>
11、拦截器的定义
在struts.xml文件中定义拦截器语法格式:
<interceptor name="拦截器名" class=“拦截器实现类/”>
12、应用定义好的拦截器
<interceptor-ref name="拦截器名/">
在struts-default.xml中有一个默认的引用,在默认情况下(也就是<action>中未引用拦截器时)会自动引用一些拦截器。
<default-interceptor-ref name="defaultStack/">
上面在defaultStack中引用的拦截器都可以<action>中不经过引用可以使用
注意:如果在<action>中引用了任何拦截器后,要使用在defaultStack中定义的拦截器,需要在<action>中重新引用。
13、params拦截器使用
当客户端的一个form想服务器端提交请求时,如有textfield,代码如下:
<s:form action="login" >
username <s:textfield name="username"/> <br>
password <s:password name="password" /> <br>
<s:submit/>
</s:form>
在提交后,Struts2将会自动调用login动作类中的setXX方法,并将文本框中的值通过setXXX方法的参数传入。
实际上,这个操作是由params拦截器完成的,params对应的类是com.opensymphony.xwork2.interception.Parameterslnterceptor.
由于params已经在defaultStack中定义,因此,在未引用拦截器的<action>中是会自动引用params的。
如下面的配置代码,在访问login动作时,Struts是会自动执行相应的setter方法的。
<action name="login" class=“com.ascent.action.LoginAction"> <result>/success.jsp</result>
<result name="input">/login.jsp</result>
</action>
这样,登陆表单中的用户名,密码参数就会在Action类中被set进去,完成登陆功能。
但如果在<action>中引用了其他拦截器,就必须显示的引用params拦截器,Struts2不能调用相应的setter方法来初始化参数。如下面的配置代码所示:
<action name="login" class=“com.ascent.action.LoginAction">
<interceptor-ref name="timer" />
<interceptor-ref name="logger"/>
<interceptor-ref name="params"/>
<result>/success.jsp</result>
<result name="input">/login.jsp</result>
</action>
我们可以不去配置params拦截器,配置timer和logger或任意一个,测试参数username、password的值,应该是没有得到表单提交的值,因为params拦截器已经不起作用了。
14、使用拦截器栈
为了能在多个动作中方便的引用同一个或几个拦截器,可以使用拦截器栈将这些拦截器当个整体来引用。
拦截器栈要在<package>标签中使用<interceptors>和子标签<interceptor-stack>来定可以像使用拦截器一样使用拦截器栈。
<package name="demo" extends="struts-default" >
<interceptors>
<interceptor-stack name="mystack">
<interceptor-ref name="timer" />
<interceptor-ref name="logger" />
<interceptor-ref name="params" />
</interceptor-stack>
</interceptors>
<action name="login" class="com.ascent.action.LoginAction">
<interceptor-ref name="mystack"/>
</action>
</package>
面向切面编程(AOP)及其作用的更多相关文章
- Spring之控制反转——IoC、面向切面编程——AOP
控制反转——IoC 提出IoC的目的 为了解决对象之间的耦合度过高的问题,提出了IoC理论,用来实现对象之间的解耦. 什么是IoC IoC是Inversion of Control的缩写,译为控制 ...
- Spring框架系列(4) - 深入浅出Spring核心之面向切面编程(AOP)
在Spring基础 - Spring简单例子引入Spring的核心中向你展示了AOP的基础含义,同时以此发散了一些AOP相关知识点; 本节将在此基础上进一步解读AOP的含义以及AOP的使用方式.@pd ...
- 设计模式之面向切面编程AOP
动态的将代码切入到指定的方法.指定位置上的编程思想就是面向切面的编程. 代码只有两种,一种是逻辑代码.另一种是非逻辑代码.逻辑代码就是实现功能的核心代码,非逻辑代码就是处理琐碎事务的代码,比如说获取连 ...
- Spring学习手札(二)面向切面编程AOP
AOP理解 Aspect Oriented Program面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 但是,这种说法有些片面,因为在软件工程中,AOP的价值体现的并 ...
- Spring学习笔记:面向切面编程AOP(Aspect Oriented Programming)
一.面向切面编程AOP 目标:让我们可以“专心做事”,避免繁杂重复的功能编码 原理:将复杂的需求分解出不同方面,将公共功能集中解决 *****所谓面向切面编程,是一种通过预编译方式和运行期动态代理实现 ...
- Spring框架学习笔记(2)——面向切面编程AOP
介绍 概念 面向切面编程AOP与面向对象编程OOP有所不同,AOP不是对OOP的替换,而是对OOP的一种补充,AOP增强了OOP. 假设我们有几个业务代码,都调用了某个方法,按照OOP的思想,我们就会 ...
- 【串线篇】面向切面编程AOP
面向切面编程AOP 描述:将某段代码“动态”的切入到“指定方法”的“指定位置”进行运行的一种编程方式 (其底层就是Java的动态代理)spring对其做了简化书写 场景: 1).AOP加日志保存到数据 ...
- 04 Spring:01.Spring框架简介&&02.程序间耦合&&03.Spring的 IOC 和 DI&&08.面向切面编程 AOP&&10.Spring中事务控制
spring共四天 第一天:spring框架的概述以及spring中基于XML的IOC配置 第二天:spring中基于注解的IOC和ioc的案例 第三天:spring中的aop和基于XML以及注解的A ...
- [译]如何在ASP.NET Core中实现面向切面编程(AOP)
原文地址:ASPECT ORIENTED PROGRAMMING USING PROXIES IN ASP.NET CORE 原文作者:ZANID HAYTAM 译文地址:如何在ASP.NET Cor ...
- 面向切面编程AOP
本文的主要内容(AOP): 1.AOP面向切面编程的相关概念(思想.原理.相关术语) 2.AOP编程底层实现机制(动态代理机制:JDK代理.Cglib代理) 3.Spring的传统AOP编程的案例(计 ...
随机推荐
- mysql怎样建表及mysql优化
1.符合数据库三范式 2.字段选择合适的数据类型 3.注意表之间的联系,一对多,多对多,一对一 4.拆分表,把不常用的字段单独成表. 5.建立索引,哪些字段建立索引?建立索引的原则?最左前缀原则,wh ...
- HDU5086——Revenge of Segment Tree(BestCoder Round #16)
Revenge of Segment Tree Problem DescriptionIn computer science, a segment tree is a tree data struct ...
- Java API —— HashMap类 & LinkedHashMap类
1.HashMap类 1)HashMap类概述 键是哈希表结构,可以保证键的唯一性 2)HashMap案例 HashMap<String,String> ...
- Use Eclipse to develop groovy[docs.codehaus.org]
http://docs.codehaus.org/display/GROOVY/Install+Groovy-Eclipse+Plugin http://docs.codehaus.org/displ ...
- 简单的SocketExample
客户端//---------------VerySimpleClient.java package SocketExample; // Tue Nov 2 18:34:53 EST 2004 // / ...
- 设计模式之Inheritance versus Parameterized Types 继承和参数化类型
Another (not strictly object-oriented)technique for reusing functionality is through parameterized t ...
- TCP-心跳
心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包. 用来判断对方(设备,进程或其它网元)是否正常运行,采用定时发送简单的通 ...
- C/c++输入输出函数
最全输入函数 c/c++一:c=getchar();功能:读入一个字符说明:调用此函数时要求在程序的第一行有预编译命令:#include<stdio>,不过在做c++时 有#include ...
- 二维树状数组(水题) POJ1195
前段时间遇到线段树过不了,树状数组却过了的题.(其实线段树过得了的) 回忆了下树状数组. 主要原理,还是二进制位数,每一项的和表示其为它的前((最后一位1及其后)的二进制数)和,可从二进制图来看.(用 ...
- abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
abstract的method不可以是static的,因为抽象的方法是要被子类实现的,而static与子类扯不上关系! native方法表示该方法要用另外一种依赖平台的编程语言实现的,不存在着被子类实 ...