一、理解 “面向切面编程”

  面向切面编程(Aspect Oriented Programming,AOP)是软件编程思想发展到一定阶段的产物,是对面向对象编程(Object Oriented Programming,OOP)的有益补充。AOP 一般适用于具有横切逻辑的场合,如访问控制、事务管理、性能监测等。

  什么是横切逻辑?观察如下代码段:

public class UserServiceImpl implements UserService {
private static final Logger log = Logger.getLogger(UserServiceImpl.class); 
public boolean addNewUser(User user) {
log.info(“添加用户 ” + user.getUsername());//记录日志
SqlSession sqlSession = null;
boolean flag = false;
//异常处理
try {
sqlSession = MyBatisUtil.createSqlSession();
if (sqlSession.getMapper(UserMapper.class).add(user) > 0)
flag = true;
sqlSession.commit(); //事务控制
} catch (Exception e) {
log.error("添加用户 " + user.getUsername() + "失败", e); //记录日志
sqlSession.rollback(); //事务控制
flag = false;
} finally {
MyBatisUtil.closeSqlSession(sqlSession);
}
return flag;
}
}
  ▶ 这是一个再典型不过的业务处理方法,日志、异常处理、事务控制等,都是一个健壮的业务系统所必需的。但是为了保证系统健壮可用,就要在众多的业务方法中反复编写类的代码,使得原本就很复杂的业务处理代码变得更加复杂。业务功能的开发者还要关注这些 “额外” 的代码是否处理正确,是否有遗漏的地方。如果需要修改日志信息的格式或者安全验证的规则,或者再增加新的铺助功能,都会导致业务代码频繁而大量的修改。
  ▶ 在业务系统中,总有一些散落、渗透到系统各处且不得不处理的事情,这些穿插在既定业务中的操作就是所谓的 “横切逻辑” ,也称为切面。我们怎样才能不受这些附加要求的干扰,专心于真正的业务逻辑呢?我们很容易想到可以将这些重复性的代码抽取出来,放在专门的类和方法中,这样就便于管理和维护了。但即便如此,依然无法实现既定业务和横切逻辑的彻底解耦合,因为业务代码中还要保留这些方法的调用代码,当需要增加或减少横切逻辑的时侯,还是要修改业务方法中的调用代码才能实现。我们希望无须编写显式的调用,在需要的时侯,系统能够 “自动” 调用所需的功能,这正是 AOP 要解决的主要问题。
  ▶ 面向切面编程,简单地说就是在不改变原程序的基础上为代码段增加新的功能,对代码段进行增强处理。它的设计思想来源于代理设计模式。
 
 在代理模式中可以为该对象设置一个代理对象,代理对象为 fun() 提供一个代理方法,当通过代理对象的 fun() 方法调用原对象的 fun() 方法时,就可以在代理方法中添加新的功能,也就是所谓的增强处理。增强的功能既可以插到原对象的 fun() 方法前面,也可以插到后面。在这种模式下,给编程人员的感觉是在原有代码乃至原业务流程都不修改的情况下,直接在业务流程中切入新代码,增强新功能,这就是所谓的面向切面编程。

面向切面相关术语

     ▶ 切面(Aspect):一个模块化的横切逻辑(或称横切关注点),可能会横切多个对象。

    ▶ 连接点(Join Point):程序执行中的某个具体的执行点。

     增强处理(Advice):切面在某个特定连接点上执行的代码逻辑。

     切入点(Pointcut):对连接点的特征进行描述,可以使用正则表达式。增强处理和一个切入点表达式相关联,并在与这个切入点匹配的某个连接点上运行。

     目标对象(Target object):被一个或多个切面增强的对象。

    ▶ AOP 代理(AOP proxy):由 AOP 框架所创建的对象,实现执行增强处理方法等功能。

    ▶ 织入(Weaving):将增强处理连接到应用程序中的类型或对象上的过程。

    ▶ 增强处理类型:在原对象的 fun() 方法之前插入的增强处埋为前置增强,该方法正常执行完以后插入的增强处理为后置增强,此外还有环绕增强,异常抛出增强、最终增强等类型。

  说明:

     1、切面可以理解为由增强处理和切入点组成,既包含了横切逻辑的定义,也包含了连接点的定义。面向切面编程主要关心两个问题,即在什么位置,执行什么功能。 Spring AOP 是负责实施切面的框架,即由 Spring AOP 完成织入工作。
    2、Advice 直译为 “通知”,但这种叫法并不确切,在此处翻译成 “增强处理”,更便于大家理解。

Spring AOP 详细介绍的更多相关文章

  1. Spring AOP详细介绍

    AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Asp ...

  2. spring AOP 之一:spring AOP功能介绍

    一.AOP简介 AOP:是一种面向切面的编程范式,是一种编程思想,旨在通过分离横切关注点,提高模块化,可以跨越对象关注点.Aop的典型应用即spring的事务机制,日志记录.利用AOP可以对业务逻辑的 ...

  3. spring——aop详细总结1

    AOP(Aspect-Oriented Programming, 面向切面编程): 是一种新的方法论, 是对传统 OOP(Object-Oriented Programming, 面向对象编程) 的补 ...

  4. 理解Spring AOP的实现方式与思想

    Spring AOP简介 如果说IOC是Spring的核心,那么面向切面编程就是Spring最核心的功能之一了,在数据库事务中,面向切面编程被广泛应用. AOP能够将那些与业务无关,却为业务模块所共同 ...

  5. Spring相框:AOP详细说明

    AOP中国的名字叫做面向方面编程.这个名字是很形象.因为你真的可以把像面包切系统.并直接增加面包的修改.科而异,对整个系统,小到一定的方法. AOP它有什么用?有关示例,各组分可以含有安全.事务.,A ...

  6. spring aop介绍和示例

    参考:<Spring in Action> 一.AOP介绍 AOP是Aspect Oriented Programming的缩写,意思是面向切面编程. 应用中有一些功能使用非常普遍,比如事 ...

  7. Spring AOP介绍与使用

    Spring AOP介绍与使用 AOP:Aspect Oriented Programming 面向切面编程 OOP:Object Oriented Programming 面向对象编程 ​ 面向切面 ...

  8. [刘阳Java]_Spring AOP注解详细介绍_第8讲

    这节内容非常关键,我们会比较详细地介绍Spring AOP注解的使用 1. 要使用Spring AOP注解,必须满足如下的事项 导入Aspectj的jar.Spring3.0-AOP.jar.aopa ...

  9. Spring AOP介绍

    1.介绍 AOP(面向切面编程)对OOP(面向对象编程)是一种补充,它提供了另一种程序结构的思路.OOP的模块单元是class,而AOP的模块单元是aspect.Spring中一个关键的组件是AOP框 ...

随机推荐

  1. scrapy 连接错误

    twisted.python.failure.failure twisted.internet.error.connectionlost: connection to the other side w ...

  2. c#数据类型和类型转换

    C# 数据类型 在 C# 中,变量分为以下几种类型: 值类型(Value types) 引用类型(Reference types) 指针类型(Pointer types) 值类型(Value type ...

  3. the little schemer 笔记(10.1)

    This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.5 China Mainla ...

  4. IE css hack整理

    CSS hack由于不同的浏览器,比如Internet Explorer 6,Internet Explorer 7,Mozillafirefox等,对CSS的解析认识不一样,因此会导致生成的页面效果 ...

  5. Sublime Text 3列编辑

    Sublime Text 3 的列编辑方式如下 1.使用鼠标 (Ubuntu 14.04验证通过) 不同的平台要使用不同的鼠标按钮: 1.1 OS X 鼠标左键 + Option 或: 鼠标中键 添加 ...

  6. subline应用之技巧

    看很多人代码编辑器都用subline,一了解这货也跨平台.支持代码提示自动补全.支持python.语法高亮.最关键的是支持列编辑(原来以为只有ue有此功能),那就果断下载使用,挺好! 列编辑:首先用鼠 ...

  7. mysql数据误删除(drop)的恢复. (ext3grep, extundelete)

    drop table tbl_name 物理删除.没有备份,没有二进制日志 在系统删除文件并非在存储中抹去数据,而仅仅是标识对应的block块可以被重新的分配使用.所以数据的恢复还是有希望的.但是那些 ...

  8. 网页尺寸scrollHeight/offsetHeight

    scrollHeight和scrollWidth,获取网页内容高度和宽度. 一.针对IE.Opera: scrollHeight 是网页内容实际高度,可以小于 clientHeight. 二.针对NS ...

  9. 亲身经历,Java面试题整理

    博主在2015年暑期参加过一些Java开发工程师实习的面试和笔试,在此将重点整理出来,以供大家学习. 资料1: 一.单继承 1.1Java类是否支持多重继承? 答:继承的基本原则是: 子类继承父类的所 ...

  10. Centos 6 安装python2.7.6

    centos 是自带python的.但是版本稍微旧一些.搞python开发,肯定要用新一点的稳定版.所以,要升级一下python. 先去python主站下载python的源码包:Python-2.7. ...