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 ...
随机推荐
- windows/linux VPS云服务器限制IP访问,限制别人的IP访问网站方法
服务器VPS云服务器如何限制IP访问,限制别人的IP访问网站的方法 windows主机IIS限制IP访问方法:首先打开IIS点击“网站”,右键属性,(如果仅给单个网站设置,请选择下边的站点,点右键“属 ...
- C语言博客作业04——数组
1.本章学习总结 1.1思维导图 1.2本章学习体会及代码量 1.2.1学习体会 这几周学习了数组,数组分为三大块:一维数组.二维数组和字符数组.数组相对于之前普通变量的好处就是可以储存数值,方便数据 ...
- 通过P3P头实现跨域设置cookie
PHP的setcookie函数可以设置域,但是只能在当前域内,如果出现多域可由如下办法处理:实现原理:www.b.com/set_cookie.php 在b域名下设置a域名的cookie < ...
- 微信里iphone后退不刷新问题解决方案
$(function() { pushHistory(); }); function pushHistory() { window.addEventListener("popstate&qu ...
- Ubuntu 18.04 下 Redis 环境搭建
一.安装 Redis ① 下载 wget http://download.redis.io/releases/redis-3.2.8.tar.gz ② 解压 tar -zxvf redis-3.2.8 ...
- GDAL——命令使用专题——gdallocationinfo命令
GDAL——命令使用专题——gdallocationinfo命令 前言 GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数 ...
- 4ci
- Java面试题之多线程打印
概述 作为程序员经常在面试的时候遇到多线程的问题,我印象比较深刻的就是下面这道题:写两个线程,一个线程打印 1~52,另一个线程打印字母A-Z.打印顺序为12A34B56C……5152Z.看这个题目已 ...
- Android 偏门xml属性
在 recycleView listview scroview 等等 活动的时候会出现蓝边 android:overScrollMode="never" 用次属性可以去掉 fadi ...
- Python序列的一点用法
#python的基本语法网上已经有很多详细的解释了,写在这里方便自己记忆一些 序列,顾名思义,是一段数据的有序排列,列表,元组,字符串都是序列的一种,序列有很多BIF(BIF是内建方法,即python ...