【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. zzw_非root用户安装python3.5

    目的:不想改变linux 自带的python,只想要用特定的非root用户运行特定版本的python 1.进入非root用户 2.新建一个python3.5的安装目录 [a4_csbdc@bdc816 ...

  2. 微信小程序页面跳转导航wx.navigateTo和wx.redirectTo

    }) wx.redirectTo(OBJECT) 关闭当前页面,跳转到应用内的某个页面. 还是用上面的三张图示作为例子,当使用wx.redirctTo接口跳转页面时,原来的页面将被删除掉,当然,这是小 ...

  3. composer 自动加载(php-amqplib)

    最近要使用RabbitMQ 做消息队列,也是刚接触到.因为用的的TP框架,comoser又下载不下来,所以只能手动下载拓展包,做手动加载,在php-amqplib是我手动下载下来的拓展包,创建一个co ...

  4. flex布局设置width无效

    子元素设置 : flex: 0 0 85px; 参数: flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto.后两个属性可选. 该属性有 ...

  5. SQL Server 主键及自增长列的修改

    一.对主键的修改 主键值都会带有主键约束,当执行update操作或是其他操作的时候就会受到限制无法修改,解决的方法是:取消主键约束->删掉主键列->插入修改后的主键值. (1)取消主键约束 ...

  6. dot.js模板实现分离式

    <!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" ...

  7. 4ci

  8. Python-接口自动化(五)

    python基础知识(五) (六)类与对象 类:某一类具有共同属性和特性的事物或者说是一个抽象的描述,比如说大佬类,你就是大佬类里面具体的一个实例.类一般包含属性和方法 (1)类的语法: class ...

  9. thinkphp5和thinkphp3.2.3中URL重写出现No input file specified

    查询后解决办法是打开public目录下的.htaccess文件,把:RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] 改为:RewriteRule ^(.*)$ i ...

  10. 【webpack学习笔记】a07-代码分离

    官方文档说进行代码分离有三种方法: 入口起点:使用entry配置手动分离. 防止重复:使用CommonsChunkPlugin插件去重合分离chunk 注:在webpack4中,CommonsChun ...