Spring - AOP简介与图示
【1】AOP
(Aspect-Oriented Programming, 面向切面编程),是一种新的方法论, 是对传统 OOP(Object-Oriented Programming, 面向对象编程) 的补充.
AOP 的主要编程对象是切面(aspect), 而切面模块化横切关注点.
在应用 AOP 编程时, 仍然需要定义公共功能, 但可以明确的定义这个功能在哪里, 以什么方式应用, 并且不必修改受影响的类. 这样一来横切关注点就被模块化到特殊的对象(切面)里.
这里要说明下,由于Spring AOP是使用JDK动态代理和CGLIB代理实现的,因此Spring AOP只可以对方法的执行进行拦截,如果需要拦截字段的访问或更新,则需要像AspectJ这样的AOP语言。
另外Spring可以无缝的集成IOC,Spring AOP 以及AspectJ AOP。
【2】AOP术语
将多处地方具有类似功能的代码(横切关注点)抽取出来,进行模块化为一个方法(通知-Advice);
将同一事务的不同方法(如前置通知、后置通知)放在一个类中(即,切面–Aspect);
在方法上利用Aspect表达式定义切点,当有匹配其表达式的目标对象方法执行时,会自动为其建立代理对象-Proxy;
切面(Aspect): 横切关注点(跨越应用程序多个模块的功能)被模块化的特殊对象--类级别
通知(Advice): 切面必须要完成的工作--即方法(方法级别)
目标(Target): 被通知的对象
代理(Proxy): 向目标对象应用通知之后创建的对象
连接点(Joinpoint):
程序执行的某个特定位置。
如类某个方法调用前、调用后、方法抛出异常后等。
连接点由两个信息确定:
方法(表示程序执行点,即-在哪个目标方法);
相对点(表示方位,即-目标方法的什么位置,如调用前、后。。。)
例如 :ArithmethicCalculator#add()方法执行前的连接点:
方法为ArithmethicCalculator#add();
相对点为该方法执行前的位置
切入点(pointcut):
AOP 通过切点定位到特定的连接点。
通过某种定义来决定哪些方法将会被通知(即需要事物处理),我们将这个定义秤为切入点(Pointcut),而每一个被处理的方法我们称之为连接点(Join Point)。
每个类都拥有多个连接点。例如 ArithmethicCalculator 的所有方法实际上都是连接点,即连接点是程序类中客观存在的事务。
类比:连接点相当于数据库中的记录,切点相当于查询条件。
切点和连接点不是一对一的关系,一个切点常常匹配多个连接点.
切点通过 org.springframework.aop.Pointcut 接口进行描述,它使用类和方法作为连接点的查询条件。
【3】AOP图示
【4】AOP简单实例
package com.web.aop.impl;
import java.util.Arrays;
import java.util.List;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
/*
@Component表示将其放入IOC容器中,使其可以被自动扫描;
@Aspect表示其为一个切面
*/
@Aspect
@Component
public class LoggingAspect {
@Before("execution(int com.web.aop.impl.ArithmeticCalculatorImpl.*(int , int ))")
public void beforMethod(JoinPoint joinPoint){
/*获取方法名*/
String methodName = joinPoint.getSignature().getName();
/*获取方法的参数*/
List<Object> args = Arrays.asList(joinPoint.getArgs());
System.out.println("The method"+methodName+" begins with"+args);
}
/*
* 后置通知:在目标方法执行后执行,无论是否抛出异常;
* 后置通知中不能访问目标方法执行后返回的结果;
* */
@After("execution(* com.web.aop.impl.*.*(int , int ))")
/*表示该包下所有返回类型的所有类的所有方法*/
public void afterMethod(JoinPoint joinPoint){
/*获取方法名*/
String methodName = joinPoint.getSignature().getName();
System.out.println("The method"+methodName+" ends ");
}
}
Spring - AOP简介与图示的更多相关文章
- Spring AOP 简介
Spring AOP 简介 如果说 IoC 是 Spring 的核心,那么面向切面编程就是 Spring 最为重要的功能之一了,在数据库事务中切面编程被广泛使用. AOP 即 Aspect Orien ...
- Spring AOP 简介(三)
Spring AOP 简介 如果说 IoC 是 Spring 的核心,那么面向切面编程就是 Spring 最为重要的功能之一了,在数据库事务中切面编程被广泛使用. AOP 即 Aspect Orien ...
- Spring AOP简介与底层实现机制——动态代理
AOP简介 AOP (Aspect Oriented Programing) 称为:面向切面编程,它是一种编程思想.AOP 是 OOP(面向对象编程 Object Oriented Programmi ...
- Spring AOP简介
AOP简述 AOP的概念早在上个世纪九十年代初就已经出现了,当时的研究人员通过对面向对象思想局限性的分析研究出了一种新的编程思想来帮助开发者减少代码重复提高开发效率,那就是AOP,Aspect-Ori ...
- Spring学习(三)Spring AOP 简介
一.简介 定义 aop就是面向切面编程,在数据库事务中切面编程被广泛使用. 在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能. 核心业务:比如登陆,增加数据,删除数据都叫核心业务 周边功能 ...
- Spring中的面向切面编程(AOP)简介
一.什么是AOP AOP(Aspect-Oriented Programming, 面向切面编程): 是一种新的方法论, 是对传统 OOP(Object-Oriented Programming, 面 ...
- Spring aop与HibernateTemplate——session管理(每事务一次 Session)
一.HibernateTemplate与Spring aop简介 参见http://bbs.csdn.net/topics/340207475中网友blueram的发言.(感谢blueram) 二.在 ...
- Spring AOP With AspectJ
一.AOP和拦截器 某些情况下,AOP和拦截器包括Filter能够实现同样的功能,一般都是请求即controller层的操作,这三个执行顺序为Filter>Interceptor>AOP, ...
- springmvc 运行原理 Spring ioc的实现原理 Mybatis工作流程 spring AOP实现原理
SpringMVC的工作原理图: SpringMVC流程 . 用户发送请求至前端控制器DispatcherServlet. . DispatcherServlet收到请求调用HandlerMappin ...
随机推荐
- Chrome的Copy Selector中带有\3
F12,右键copy selector就是这个结果. 查询到如下资料: https://stackoverflow.com/questions/20043347/css-css-coding-that ...
- rpm -ivh 安装与 rpm -U安装解决问题一例
[root@localhost server3.10.12]# rpm -ivh krb5-libs-1.15.1-18.el7.x86_64.rpm警告:krb5-libs-1.15.1-18.e ...
- 小程序for循环绑定每组数据的id,并通过id获取里面某个数组的值的方法
WXML: <block wx:for="{{nums}}" wx:for-index='key' wx:for-item='item'> <view class ...
- c语言操作文件函数大全
fopen(打开文件)相关函数 open,fclose表头文件 #include<stdio.h>定义函数 FILE * fopen(const char * path,const cha ...
- canvas 实现刮刮乐
在解决问题前,我们先来了解一下 canvas 标签canvas 是 html5 出现的新标签,像所有的 dom 对象一样它有自己本身的属性.方法和事件,其中就有绘图的方法,js 能够调用它来进行绘图. ...
- jquery的js代码兼容全部浏览器的解决方法
//以下均可console.log()实验 var winW=document.body.clientWidth||document.docuemntElement.clientWidth;//网 ...
- 二叉树的简单操作(Binary Tree)
树形结构应该是贯穿整个数据结构的一个比较重要的一种结构,它的重要性不言而喻! 讲到树!一般都是讨论二叉树,而关于二叉树的定义以及概念这里不做陈诉,可自行搜索. 在C语言里面需要实现一个二叉树,我们需要 ...
- Python 实现清屏
使用Python的IDLE到某个程序节点时,需要清屏以提高清晰度. 但IDLE本身并没有这个功能,我们可以通过扩展来实现类似于Ctrl + L的清屏 资料来自于百度经验的 BinnLZeng 先制作一 ...
- asp调用短信接口实现用户注册
前几天做一个asp语言开发的网站需要实现用户注册短信验证功能,就研究了一下如何实现,简单给大家分享下调用过程. 首先需要找到一个第三方短信接口,当时用的是动力思维乐信的短信接口. 首先需要先注册个动力 ...
- P2010 回文日期 题解
这题其实就是纯暴力,暴力,再暴力,毫无技巧可言(总之您怎么乱搞都不会超时QAQ) 首先,根据题意,我们明白每年自多产生一个回文日期,因为对于每年的三百多天,前四位是固定的. 所以,我们只需要进行一个从 ...