Spring面向切面编程(AOP)详解

面向切面编程(AOP)是Spring框架的另外一个重要的核心内容。
而在讲AOP之前,先来了解一下动态代理这个概念,因为AOP基于动态代理。
动态代理概念:在程序执行的过程中,创建代理对象。通过代理对象执行目标方法,在不影响原来的目标方法的前提下,增加额外的功能。就简单来说,就是在目标方法内部执行代码不变的情况下,增加额外的功能。

面向切面编程(AOP)概念:面向切面编程基于动态代理,其实就是动态代理的规范化,把动态代理的实现步骤、方法都定义好了,让开发人员使用一套统一的方式去使用动态代理。

前面的概念是不是很抽象呢?莫慌,下面会详细去理解面向切面编程。

面向切面编程,这个切面到底是什么呢?可以这样子去理解,就是需要添加到目标方法的额外功能,就像三明治,火腿片和鸡蛋片中间需要加入面包片一样,而目标方法就像火腿片和鸡蛋片,切面相当于面包片。这样子应该就可以更好的去理解面向切面编程了。

AOP中涉及到的术语
(1)切面(Aspect):表示增强功能,而非业务方法,常见的切面需要完成的功能有:日志,事务,统计信息,参数检查,权限验证。
(2)连接点(JoinPoint):连接业务方法和增强功能的位置,就是业务方法。
(3)切入点(Pointcut):指连接方法的集合。
(4)目标对象:给哪个类添加增强功能,哪个类就是目标对象。
(5)通知(Advice):通知表示切面功能执行的时间。

切面三要素:
(1)切面的功能代码
(2)切面的指向位置(Pointcut)
(3)切面的指向时间(Advice)

AOP实现使用到的框架
(1)Spring框架内部实现的AOP规范,当在pom.xml文件中加入spring依赖的时候,就已经添加进来。

(2)aspectJ:一个开源的专门做AOP的框架,而Spring框架中又集成了该框架,所以通过Spring框架就可以使用该框架的功能。

下面以切面三要素展开解释aspectJ框架的使用
(1)声明切面类
创建了切面类之后,若没有使用声明切面类的注解@Aspect的话,该类和普通的类没有任何的区别,所以需要在切面类的上面使用注解@Aspect声明切面类。

/*** @Aspect:该注解声明下面的类为切面类,这个类当中有切面功能代码* 位置:在类的上面定义*/
//切面类
@Aspect
public class MyAspect {}

(2)切面类的执行时间,aspectJ提供五个注解(三个掌握,两个了解)来代表执行时间
1)(掌握)@Before(前置通知)
语法格式:

 @Before(value = "切入点表达式")

2)(掌握)@AfterReturning(后置通知)
语法格式

@AfterReturning(value = "切入点表达式",returning = "目标方法的返回值")

3)(掌握)@Around(环绕通知)
语法格式

@Around(value = "切入点表达式")

4)(了解)@AfterThrow(异常通知)
5)(了解)@After (最终通知)
这里需要解释的还有切入点表达式:
格式:
execution(访问权限 方法返回值 方法声明(参数)异常类型)
其中方法返回值和方法声明是必须要的,其他两个一般可以不写。
为了方便写切入点表达式,提供如下方便的写法:
(1)符号*:代表0到任意多个字符
(2)符号…:用在方法参数当中,表示任意多个参数,用在包名后,代表当前包及其子包路径。

使用aspectJ框架实现AOP的步骤如下:
(1)新建一个maven项目
(2)加入依赖(spring依赖和aspectJ依赖)

 <!--spring依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.3.7.RELEASE</version></dependency><!--aspectJ依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>4.3.7.RELEASE</version></dependency>

(3)创建目标接口和实现类
(4)创建切面类
(5)创建spring配置文件
1)声明目标类对象
2)声明切面类对象
3)声明自动代理生成器标签

<!--    声明自动代理生成器--><aop:aspectj-autoproxy />

(3)切入点
@Pointcut:定义和管理切入点,如果项目中有多个相同的切入点表达式,就可以使用该注解
该如何使用@Pointcut标签呢?
需要定义一个方法,该方法为私有,并且不需要方法体,此时这个方法的名称就是切入点表达式的别名,其他需要使用该切入点表达式的注解,只需要使用该别名即可。

Spring面向切面编程(AOP)详解相关推荐

  1. Spring面向切面编程-AOP详解

    文章目录 前言 介绍AOP 一.实现AOP 1.1.全注解形式实现AOP 前提准备(引入jar包) 实现AOP(五种通知) 二.认识JoinPont与ProceedingJoinPoint 2.1.初 ...

  2. Spring→面向切面编程AOP、相关概念、通知Advice类型、配置切面切入点通知、AOP相关API、AOP代理类ProxyFactoryBean、AOP注解@AspectJ

    面向切面编程AOP CGLib AOP相关概念 Advice类型 Spring实现AOP Spring配置切面aspect 配置切入点pointcut 配置通知advice 配置通知参数 调用新的父类 ...

  3. SpringAop面向切面编程使用详解

    一.AOP概述 1.1 AOP的概念 AOP(Aspect Oriented Programing)面向切面编程. 它是一种编程范式,属于软工范畴,指导开发者如何组织程序结构. 它是是通过预编译方式和 ...

  4. Spring——面向切面编程(AOP)

    1 AOP概述   AOP 并不是 Spring 框架的专属名称,它的全称是 Aspect Oriented Programming ,意为:面向切面编程.   在程序运行某个方法的时候,不修改原始执 ...

  5. Spring之面向切面编程AOP(八)

    介绍&步骤 视频教程: https://www.bilibili.com/video/BV1WZ4y1P7Bp?p=121 官方笔记链接:https://pan.baidu.com/s/1dn ...

  6. Spring in Action 入门之面向切面编程AOP

    注明:这篇文章一是当成学习笔记,二是给大家提供另一个快速理解学习Spring的参考.欢迎留言讨论,持续更新中~ (该部分是Spring的面向切面编程AOP) 第四章 通知Bean 在软件编程中,散布于 ...

  7. Spring(四):面向切面编程AOP

    2019独角兽企业重金招聘Python工程师标准>>> 横切关注点:分布于应用中多处的功能 面向切面编程AOP:将横切关注点与业务逻辑相分离 在使用面向切面编程时,仍在一个地方定义通 ...

  8. Spring 面向切面编程(AOP) D5

    Spring AOP简介 问题提出 首先我们回顾一下OOP(Object Oriented Programming-面向对象编程),OOP引入了封装.继承.多态等概念建立了一种对象层次结构,用于模拟公 ...

  9. 九、面向切面编程AOP

    本栏博客目录 一.Spring的IOC和DI 二.IoC和DI注解开发 三.SpringMVC入门 四.SpringMVC的请求和响应 五.JdbcTemplate 六.Spring练习 七.Spri ...

最新文章

  1. Eclipse公共许可证
  2. c语言glut打正方形,OpenGL绘制正方形并用键盘移动
  3. 音频系统,Alsa 里面的buff 是怎么计算的?
  4. 仿短视频竖屏播放源码
  5. IT项目范围管理案例分析——柳工错在哪里?
  6. 猫癣病毒躲猫猫移师广东东莞月入百万作者
  7. 史上最强三千六百道脑筋急转弯
  8. R语言怎么写积分_2. 角速度的积分
  9. vue less 换肤
  10. vscode vue代码格式化无效详细解决方案
  11. JavaEE进阶知识学习-----Java8新特性知识学习-4-1-StreamAPI
  12. phpstorm官方下载地址
  13. 全球及中国泵真空系统行业发展战略与十四五布局规划报告2022版
  14. OpenSCAP安装与使用
  15. SPA单页面应用首屏加载速度提升方法
  16. 智能制造并非只是自动化
  17. 如何更高效更系统地学习3D视觉?
  18. linux下的IDE--codelite
  19. Keras : 训练heart心脏病诊断训练集并测试
  20. VHDL三输入与门、四选一复用器

热门文章

  1. office2016/2019版本打开时出现卡顿的解决办法
  2. 数据分析项目实战项目五:商品画像与产品关联分析体系实战
  3. 中职计算机教育 论文题目,比较好写的中职计算机教育论文题目 中职计算机教育专业论文题目怎样拟...
  4. 杂谈:英雄联盟和魔兽
  5. window.print()进入到打印预览界面后无法进行布局和纸张选择等设置的原因及解决方法
  6. 直播源代码,循环显示、隐藏QQ或微信
  7. LOL心得哈(与代码无关....)
  8. 结合 Milvus 的医疗问答辅助标记平台
  9. 计算机仿真cad答案,CAD与计算机仿真作业.doc
  10. Redis RU101课程 Introduction to Redis Data Structures 第3周学习笔记