在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)及其作用的更多相关文章

  1. Spring之控制反转——IoC、面向切面编程——AOP

      控制反转——IoC 提出IoC的目的 为了解决对象之间的耦合度过高的问题,提出了IoC理论,用来实现对象之间的解耦. 什么是IoC IoC是Inversion of Control的缩写,译为控制 ...

  2. Spring框架系列(4) - 深入浅出Spring核心之面向切面编程(AOP)

    在Spring基础 - Spring简单例子引入Spring的核心中向你展示了AOP的基础含义,同时以此发散了一些AOP相关知识点; 本节将在此基础上进一步解读AOP的含义以及AOP的使用方式.@pd ...

  3. 设计模式之面向切面编程AOP

    动态的将代码切入到指定的方法.指定位置上的编程思想就是面向切面的编程. 代码只有两种,一种是逻辑代码.另一种是非逻辑代码.逻辑代码就是实现功能的核心代码,非逻辑代码就是处理琐碎事务的代码,比如说获取连 ...

  4. Spring学习手札(二)面向切面编程AOP

    AOP理解 Aspect Oriented Program面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 但是,这种说法有些片面,因为在软件工程中,AOP的价值体现的并 ...

  5. Spring学习笔记:面向切面编程AOP(Aspect Oriented Programming)

    一.面向切面编程AOP 目标:让我们可以“专心做事”,避免繁杂重复的功能编码 原理:将复杂的需求分解出不同方面,将公共功能集中解决 *****所谓面向切面编程,是一种通过预编译方式和运行期动态代理实现 ...

  6. Spring框架学习笔记(2)——面向切面编程AOP

    介绍 概念 面向切面编程AOP与面向对象编程OOP有所不同,AOP不是对OOP的替换,而是对OOP的一种补充,AOP增强了OOP. 假设我们有几个业务代码,都调用了某个方法,按照OOP的思想,我们就会 ...

  7. 【串线篇】面向切面编程AOP

    面向切面编程AOP 描述:将某段代码“动态”的切入到“指定方法”的“指定位置”进行运行的一种编程方式 (其底层就是Java的动态代理)spring对其做了简化书写 场景: 1).AOP加日志保存到数据 ...

  8. 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 ...

  9. [译]如何在ASP.NET Core中实现面向切面编程(AOP)

    原文地址:ASPECT ORIENTED PROGRAMMING USING PROXIES IN ASP.NET CORE 原文作者:ZANID HAYTAM 译文地址:如何在ASP.NET Cor ...

  10. 面向切面编程AOP

    本文的主要内容(AOP): 1.AOP面向切面编程的相关概念(思想.原理.相关术语) 2.AOP编程底层实现机制(动态代理机制:JDK代理.Cglib代理) 3.Spring的传统AOP编程的案例(计 ...

随机推荐

  1. 【mongoDB基础篇①】安装与常用操作语句

    简述 mongoDB与redis同为noSql数据库,但是redis为kv数据库(key/value),而mongoDB为文档型数据库存储的是文档(Bson->json的二进制化).内部执行引擎 ...

  2. flexbox弹性盒子布局

    混合划分 demo1,css: #demo1{ width: 100%; background: #ccc; display: -webkit-flex;/*表示使用弹性布局*/ } #demo1 . ...

  3. C语言复习笔记-17种小算法-解决实际问题

    判断日期为一年中的第几天(考虑闰年) 1 /* 2 * 计算该日在本年中是第几天,注意闰年问题 3 * 以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天 4 * 特殊情况,闰年且 ...

  4. Delphi 中的 procedure of object (类方法存在一个隐藏参数self),简单深刻 good

    其实要了解这些东西,适当的学些反汇编,WINDOWS内存管理机制,PE结构,看下李维的VCL架构剖析可以很好理解type TMyEvent = procedure of object;这是一种数据类型 ...

  5. Ossec常用命令

    启动并查看httpd服务 systemctl start httpd systemctl status httpd.service 启动并查看mysql服务 systemctl start maria ...

  6. IIS 无法打开页面,只能重启的问题

    最终解决方案: 要变通解决此问题,启用 EnableAggressiveMemoryUsage 注册表项在注册表中.当启用了 EnableAggressiveMemoryUsage 注册表项 Http ...

  7. Android Dialogs(6)Dialog类使用示例:用系统theme和用自定义的theme

    使用dialog时有很多 方法,其中一个就是直接 使用基类Dialog,可用来作一个没有按钮的非模态提示框,它可以直接从系统的主题构造也可从自定义的主题构造. 基本步骤: a,构造 b,调用dialo ...

  8. Android studio编译之后显示中文乱码的问题解决办法

    在build.gradle文件中加上 android {compileOptions.encoding = "GBK"}

  9. Oracle SQL大全

    一. 基本操作表和数据 -- 建表 CREATE TABLE ab_student ( id number(4) ) create table ab_class( id number(4), name ...

  10. LA 4329 (树状数组) Ping pong

    第一次写树状数组,感觉那个lowbit位运算用的相当厉害. 因为-x相当于把x的二进制位取反然后整体再加上1,所以最右边的一个1以及末尾的0,取反加一以后不变. 比如1000取反是0111加一得到10 ...