【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 "); } }

扫码向博主提问

去开通我的Chat快问

j080624

非学,无以致疑;非问,无以广识
  • 擅长领域:
  • Java
  • 数据库
  • Linux
  • HTML5
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/J080624/article/details/53665692

Spring - AOP简介与图示的更多相关文章

  1. Spring AOP 简介

    Spring AOP 简介 如果说 IoC 是 Spring 的核心,那么面向切面编程就是 Spring 最为重要的功能之一了,在数据库事务中切面编程被广泛使用. AOP 即 Aspect Orien ...

  2. Spring AOP 简介(三)

    Spring AOP 简介 如果说 IoC 是 Spring 的核心,那么面向切面编程就是 Spring 最为重要的功能之一了,在数据库事务中切面编程被广泛使用. AOP 即 Aspect Orien ...

  3. Spring AOP简介与底层实现机制——动态代理

    AOP简介 AOP (Aspect Oriented Programing) 称为:面向切面编程,它是一种编程思想.AOP 是 OOP(面向对象编程 Object Oriented Programmi ...

  4. Spring AOP简介

    AOP简述 AOP的概念早在上个世纪九十年代初就已经出现了,当时的研究人员通过对面向对象思想局限性的分析研究出了一种新的编程思想来帮助开发者减少代码重复提高开发效率,那就是AOP,Aspect-Ori ...

  5. Spring学习(三)Spring AOP 简介

    一.简介 定义 aop就是面向切面编程,在数据库事务中切面编程被广泛使用. 在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能. 核心业务:比如登陆,增加数据,删除数据都叫核心业务 周边功能 ...

  6. Spring中的面向切面编程(AOP)简介

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

  7. Spring aop与HibernateTemplate——session管理(每事务一次 Session)

    一.HibernateTemplate与Spring aop简介 参见http://bbs.csdn.net/topics/340207475中网友blueram的发言.(感谢blueram) 二.在 ...

  8. Spring AOP With AspectJ

    一.AOP和拦截器 某些情况下,AOP和拦截器包括Filter能够实现同样的功能,一般都是请求即controller层的操作,这三个执行顺序为Filter>Interceptor>AOP, ...

  9. springmvc 运行原理 Spring ioc的实现原理 Mybatis工作流程 spring AOP实现原理

    SpringMVC的工作原理图: SpringMVC流程 . 用户发送请求至前端控制器DispatcherServlet. . DispatcherServlet收到请求调用HandlerMappin ...

随机推荐

  1. 一个狗血的mysql编码错误

    执行查询语句总是报错,某个查询语句字段编码错误. 各种修改那个表没用, 最后发现是创建schemas的时候没有加编码 应该由 CREATE SCHEMA new_schema;改为 CREATE SC ...

  2. js前端性能优化之函数节流和函数防抖

    前言:针对一些会频繁触发的事件如scroll.resize,如果正常绑定事件处理函数的话,有可能在很短的时间内多次连续触发事件,十分影响性能 节流: 节流:使得一定时间内只触发一次函数. 它和防抖动最 ...

  3. python数据结构与算法之问题求解实例

    关于问题求解,书中有一个实际的案例. 上图是一个交叉路口的模型,现在问题是,怎么安排红绿灯才可以保证相应的行驶路线互不交错. 第一步,就是把问题弄清楚. 怎么能让每一条行驶路线不冲突呢? 其实,就是给 ...

  4. 银行卡卡bin

    卡BIN指的是发卡行识别码,英文全称是 Bank Identification Number,缩写为 BIN.中文即“银行识别代码”  银行卡的卡号是标识发卡机构和持卡人信息的号码 一般是13-19位 ...

  5. js简单封装样式

    class Foo{ constructor(name) { this.name = name } greet() { console.log('hello this is',this.name) } ...

  6. centes7安装wdcp

    CentOS7安装WDCP3       CentOS7安装WDCP3.2面板教程 到此WDCP安装完毕

  7. windows下Go升级及GoLand的安装激活

    之前在qor/China上问golang项目包有没有一键安装,有位朋友给出了回复: 于是,尝试了下升级Go,目前版本是1.10.1,现升级为为1.12.2.步骤如下: 一.下载安装包 下载地址:htt ...

  8. Unity中Terrain中刷出的树木模糊解决办法

    Billboard Start  该项用于设定摄像机将树渲染为广告牌的距离.

  9. Python_Mix*OS模块,序列化模块种的json,pickle

    os.path.basename(path)返回path最后的文件名,如何path以/或\结尾,那么就会返回空值,即os.path.split(path)的第一个元素 ret = os.path.ba ...

  10. 大数据之NBA

    2017年NBA季后赛落幕后,网络上仍有大量关于NBA关键词的搜索. 这是近30天来,通过PC端和移动端搜索的趋势,可以看到有些日期的搜索指数是猛增的,因为NBA有大新闻爆出,比如8月23日,骑士与凯 ...