参考:

https://blog.csdn.net/jeffleo/article/details/54136904

一、AOP的核心概念
AOP(Aspect Oriented Programming),是面向切面编程的技术。AOP基于IoC基础,是对OOP的有益补充,流行的AOP框架有Sping AOP、AspectJ

AOP技术它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为”Aspect”,即切面。所谓”切面”,简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性

1、切面(aspect)

散落在系统各处的通用的业务逻辑代码,如上图中的日志模块,权限模块,事务模块等,切面用来装载pointcut和advice

2、通知(advice)

所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类

3、连接点(joinpoint)

被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器

4、切入点(pointcut)

拦截的方法,连接点拦截后变成切入点

6、目标对象(Target Object)

代理的目标对象,指要织入的对象模块,如上图的模块一、二、三

7、织入(weave)

通过切入点切入,将切面应用到目标对象并导致代理对象创建的过程

8、AOP代理(AOP Proxy)

AOP框架创建的对象,包含通知。在Spring中,AOP代理可以是JDK动态代理或CGLIB代理


切入点表达式及其通用化:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:aop="http://www.springframework.org/schema/aop"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://www.springframework.org/schema/aop
  8. http://www.springframework.org/schema/aop/spring-aop.xsd">
  9.  
  10. <!-- 配置spring的ioc,把service对象配置进来-->
  11. <bean id="accountService" class="cn.flypig666.service.impl.AccountServiceImpl"></bean>
  12.  
  13. <!-- 配置Logger类-->
  14. <bean id="logger" class="cn.flypig666.utils.Logger"></bean>
  15.  
  16. <!-- 配置AOP-->
  17. <aop:config>
  18. <!-- 配置切入点表达式,id属性用于指定表达式的唯一标识,expression属性用于指定表达式的内容
  19. 此标签写在aop:aspect标签内部只能在当前切面使用
  20. 它还可以写在aop:aspect外面,此时就变成了所有切面可用
  21. -->
  22. <aop:pointcut id="pt1" expression="execution(* *..*.*(..))"></aop:pointcut>
  23. <!-- 配置切面-->
  24. <aop:aspect id="logAdvice" ref="logger">
  25. <!-- 配置通知的类型,并且建立通知方法和切入点方法的关联-->
  26. <!-- 配置前置通知,在切入点方法执行之前执行-->
  27. <aop:before method="beforePrintLog" pointcut-ref="pt1"></aop:before>
  28.  
  29. <!-- 配置后置通知,在切入点方法正常执行之后执行,它和异常通知永远只能执行一个-->
  30. <aop:after-returning method="afterReturningPrintLog" pointcut-ref="pt1"></aop:after-returning>
  31.  
  32. <!-- 配置异常通知,在切入点方法执行产生异常之后执行,它和后置通知永远只能执行一个-->
  33. <aop:after-throwing method="afterThrowingPrintLog" pointcut-ref="pt1"></aop:after-throwing>
  34.  
  35. <!-- 配置最终通知,无论切入点方法是否正常执行它都会在其后面执行-->
  36. <aop:after method="afterPrintLog" pointcut-ref="pt1"></aop:after>
  37.  
  38. </aop:aspect>
  39. </aop:config>
  40. </beans>

spring中的环绕通知:

  1. /**
  2. * 环绕通知:
  3. * 当我们配置了环绕通知之后,切入点方法没有执行,而通知方法执行了,
  4. * 分析:
  5. * 通过对比动态代理中的环绕通知代码,发现动态代理的环绕通知有明确的切入点方法调用,而我们代码中没有
  6. * 解决:
  7. * Spring框架为我们提供了一个接口,ProceedingJoinPoint,该接口有一个方法proceed(),此方法就相当于明确调用切入点方法
  8. * 该接口可以作为环绕通知的方法参数,在程序运行时,spring框架为我们提供了该接口的实现类给我们使用
  9. *
  10. * spring中的环绕通知:
  11. * 它是spring框架为我们提供的一种可以在代码中手动控制增强方法何时执行的方式
  12. */
  13. public Object aroundPrintLog(ProceedingJoinPoint pjp) {
  14. Object rtValue = null;
  15. try {
  16. Object[] args = pjp.getArgs(); // 得到方法执行所需的参数
  17.  
  18. System.out.println("Logger类中的aroundPrintLog方法开始记录日志了....前置");
  19.  
  20. pjp.proceed(args); // 明确调用业务层方法(切入点方法)
  21.  
  22. System.out.println("Logger类中的aroundPrintLog方法开始记录日志了....后置");
  23. return rtValue;
  24. } catch (Throwable throwable) {
  25. System.out.println("Logger类中的aroundPrintLog方法开始记录日志了....异常");
  26. throw new RuntimeException(throwable);
  27. } finally {
  28. System.out.println("Logger类中的aroundPrintLog方法开始记录日志了....最终");
  29. }
  30. }

spring:AOP面向切面编程02的更多相关文章

  1. 详细解读 Spring AOP 面向切面编程(二)

    本文是<详细解读 Spring AOP 面向切面编程(一)>的续集. 在上篇中,我们从写死代码,到使用代理:从编程式 Spring AOP 到声明式 Spring AOP.一切都朝着简单实 ...

  2. 浅谈Spring AOP 面向切面编程 最通俗易懂的画图理解AOP、AOP通知执行顺序~

    简介 我们都知道,Spring 框架作为后端主流框架之一,最有特点的三部分就是IOC控制反转.依赖注入.以及AOP切面.当然AOP作为一个Spring 的重要组成模块,当然IOC是不依赖于Spring ...

  3. spring AOP面向切面编程学习笔记

    一.面向切面编程简介: 在调用某些类的方法时,要在方法执行前或后进行预处理或后处理:预处理或后处理的操作被封装在另一个类中.如图中,UserService类在执行addUser()或updateUse ...

  4. 【Spring系列】Spring AOP面向切面编程

    前言 接上一篇文章,在上午中使用了切面做防重复控制,本文着重介绍切面AOP. 在开发中,有一些功能行为是通用的,比如.日志管理.安全和事务,它们有一个共同点就是分布于应用中的多处,这种功能被称为横切关 ...

  5. 从源码入手,一文带你读懂Spring AOP面向切面编程

    之前<零基础带你看Spring源码--IOC控制反转>详细讲了Spring容器的初始化和加载的原理,后面<你真的完全了解Java动态代理吗?看这篇就够了>介绍了下JDK的动态代 ...

  6. Spring AOP面向切面编程详解

    前言 AOP即面向切面编程,是一种编程思想,OOP的延续.在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等等.在阅读本文前希望您已经对Spring有一定的了解 注:在能对代码进行添 ...

  7. Spring AOP 面向切面编程相关注解

    Aspect Oriented Programming 面向切面编程   在Spring中使用这些面向切面相关的注解可以结合使用aspectJ,aspectJ是专门搞动态代理技术的,所以比较专业.   ...

  8. Spring AOP 面向切面编程入门

    什么是AOP AOP(Aspect Oriented Programming),即面向切面编程.众所周知,OOP(面向对象编程)通过的是继承.封装和多态等概念来建立一种对象层次结构,用于模拟公共行为的 ...

  9. 详细解读 Spring AOP 面向切面编程(一)

    又是一个周末, 今天我要和大家分享的是 AOP(Aspect-Oriented Programming)这个东西,名字与 OOP 仅差一个字母,其实它是对 OOP 编程方式的一种补充,并非是取而代之. ...

随机推荐

  1. Vue的data选项使用注意

    使用组件时,大多数可以传入到Vue构造器中的选项可以在Vue extend()或 Vue.component() 中注册组件时使用,但是有一个重要的前提:data必须是函数 .在 var vm = n ...

  2. CentOS下安装Lua

    Lua是一种轻量小巧的脚本语言,用标准  C语言编写并以源代码形式开放,其设计目的是 为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能.官网: http://www.lua.org/ 安装过 ...

  3. NX二次开发-UFUN单对象选择对话框UF_UI_select_with_single_dialog

    #include <uf.h> #include <uf_ui.h> ], void* user_data, UF_UI_selection_p_t select) { if ...

  4. NX二次开发-UFUN工程图表格注释获取某一行的tag函数UF_TABNOT_ask_nth_row

    NX9+VS2012 #include <uf.h> #include <uf_tabnot.h> #include <NXOpen/Part.hxx> #incl ...

  5. 构建高性能高并发Java系统 .

    转:http://blog.csdn.net/nengyu/article/details/7591854 场景这里指的高性能高并发服务器是一个有状态的服务,可以理解成web或者socket服务器,每 ...

  6. fasttext的基本使用 java 、python为例子

    fasttext的基本使用 java .python为例子 今天早上在地铁上看到知乎上看到有人使用fasttext进行文本分类,到公司试了下情况在GitHub上找了下,最开始是c++版本的实现,不过有 ...

  7. mac下google插件SwitchyOmega笔记

    端口:

  8. 在jsp页面直接读取mysql数据库显示数据

    闲来无事,学学java,虽说编程语言相通,但是接触一门新知识还是有些疑惑,边学边记录,方便以后温故. 直接给出代码: <%@page import="java.sql.ResultSe ...

  9. 3. Vim入门教程

    1. 基本概念 1.1 了解Vim的三个基本模式 当我们安装完一个编辑器后,肯定会打开它,然后在里面输入点什么东西,但是打你打开Vim后,想要输入点什么却发现自己什么都没有输入,所以在写点东西之前,先 ...

  10. AtCoder ABC 132E Hopscotch Addict

    题目链接:https://atcoder.jp/contests/abc132/tasks/abc132_e 题目大意 给定一张 N 个点 M 条边无自环无重边的一张有向图,求从起点 S 能否三步三步 ...