文章目录

  • 一些术语
  • 开发的注意事项
  • 开发快速入门
  • 切点表达式的写法
    • 切点表达式的抽取
  • 通知的类型

一些术语

Spring的AOP实现底层就是对上面的动态代理的代码进行了封装,封装后我们只需要对需要关注的部分进行代码编写,并通过配置的方式完成指定目标的方法增强。
AOP的相关术语,常用的术语如下:
Target (目标对象) :代理的目标对象,其中的方法被称为目标方法
Proxy (代理) :一个类被AOP织入增强后,就产生一个结果代理类
Joinpoint (连接点) :所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点。在这里,简单来说,连接点就是可以被进行配置增强的方法
Pointcut (切入点) :所谓切入点是指我们要对哪些Joinpoint进行拦截的定义。这里简单来说,就是被配置增强的目标方法
Aope (通知/增强) :所谓通知是指拦截到linpont之后所要做的事情就是通如。简单来说,就是我们的增强方法。
Aspect (切面) :是切入点和通知(增强)的结合。就是,增强方法和被配置了增强的目标方法的结合体
Weaving (织入) :是指把增强应用到目标对象来创建新的代理对象的过程。spring采用动态代理织入,而Aspect采用编译期织入和类装载期织入。就是指,把切入点和通知的结合过程就是织入

开发的注意事项

  1. 需要编写的内容:
    编写核心业务代码(目标类的目标方法)
    编写切面类,切面类中有通知(增强功能方法)
    在配置文件中,配置织入关系,即将哪些通知与哪些连接点进行结合
  2. AOP技术实现的内容:
    Spring框架监控切入点方法的执行。 一旦监控到切入点方法被运行,使用代理机制,动态创建目标对象的代理对象,根据通知类别,在代理对象的对应位置,将通知对应的功能织入,完成完整的代码逻辑运行。即,我们写切入点,和通知,然后给这俩形成切面。然后当程序运行到切入点对应的增强方法的时候,程序会自动根据切面生成代理对象,在生成代理对象的时候,会在对应位置将通知对应的功能织入
  3. AOP底层使用哪种代理方式
    在spring中,框架会根据目标类是否实现了接口来决定采用哪种动态代理的方式。有接口用JDK的,无接口,用cglib的

开发快速入门

这里,一个基于XMl配置文件的简单实现
步骤:
1:导入AOP相关包坐标,这里,我们不仅要导入Spring的相关坐标,我们还要导入一个aspectjweaver的包的坐标。为啥?因为这个包实现AOP思想的方式比Spring自带的实现方式更好,所以spring就推荐开发者用这个。
2:创建目标接口和目标类(内部有切点)
3:创建切面类(不是增强类,切面类内部有增强方法)
4:将目标类和切面类的对象创建权交给spring
5:在applicationContextxml中配置织入关系
6:测试代码

  1. 导入这四个需要的包:
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.4</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.0.5.RELEASE</version></dependency>
  1. 创建目标接口和目标类(内部有切点)
  2. 创建切面类(不是增强类,切面类内部有增强方法)
  3. 将目标类和切面类的对象创建权交给spring
    就是简单的配置Bean
  4. 在applicationContextxml中配置织入关系
    记得先引入aop的命名空间,这里的引入方式和引入context命名空间的方式一样,就只是修改beans
  5. 测试代码
    创建一个测试类
    通过这样的方式来进行测试

切点表达式的写法

表达式语法:
execution([修饰符]返回值类型 包名.类名.方法名(参数))
访问修饰符可以省略
返回值类型、包名、类名方法名可以使用*星号代表任意(同时包括没有,即,比如没有返回值的也会匹配上)
包名与类名之间一个点.代表当前包下的类,两个点…表示当前包及其子包下的类
参数列表可以使用两个点。表示任意个数,任意类型的参数列表
在表达式中,这样来设置参数:* com.it_LYH.AOP.Target.*(int,String)只写参数列表中的参数类型就行

一些简单的例子:

excution(publi void com.it_LYH.AOP.method())
//上面是表示指定包下的指定方法(不常用)
execution(void com.it_LYH.AOP.Target.*(..))
//上面是Target类下的无返回值的有任意参数的任意方法
execution(* com.it_LYH.AOP.*.*(..))
//上面是AOP下的任意类的任意返回值的任意参数的任意方法
execution(* com.it_LYH.AOP..*.*(..))
//上面是AOP包下和其子包下的任意类的任意返回值的任意参数的任意方法
execution(* *..*.*(..))
//上面是表示任意方法

切点表达式的抽取

当多个增强的切点表达式相同时,可以将切点表达式进行抽取,在增强中使用pointcut-ref属性代替pointcut属性来引用抽取后的切点表达式。
比如:

通知的类型

有这么几种:其实具体是这样的

  1. 环绕通知:
  2. 异常抛出通知:
    这里定义一个会出现异常的方法(切点):
    然后这里一个处理异常的方法(通知):
    配置:
    然后调用:
    然后:通知进行了执行

AOP----开发简介相关推荐

  1. aop简介-aop开发明确的事

    AOP 开发明确的事项 1)需要编写的内容 编写核心业务代码(目标类的目标方法) 编写切面类,切面类中有通知(增强功能方法) 在配置文件中,配置织入关系,即将哪些通知与哪些连接点进行结合 2)AOP ...

  2. 关于框架Spring------学习的第三天(AOP开发)

    Spring关于AOP开发的相关知识 1.Spring 的 AOP 简介 1.1 什么是 AOP 1.2 AOP 的动态代理技术 1.3 JDK 的动态代理 1.4 cglib 的动态代理 1.5 A ...

  3. 网络增强现实开发简介 Introduction to Web AR development

    搭配webXR.mindAR.three.js和tensorflow.js 你会学到: 获得构建不同类型的网络增强现实应用程序的实践经验,包括图像效果.人脸效果和世界效果 获得关于增强现实如何在网络浏 ...

  4. 【Flutter】Flutter 混合开发 ( 简介 | Flutter 混合开发集成步骤 | 创建 Flutter Module )

    文章目录 一.Flutter 混合开发简介 二.Flutter 混合开发集成步骤 三.创建 Flutter Module 1.使用命令行创建 Flutter Module 项目 ( 仅做参考 ) 2. ...

  5. AOP开发——在不修改源代码的前提下,对类里面的方法进行增强 : 前置 后置 环绕 异常||如何得到目标方法的参数和返回值

    AOP开发 @Transactionl 在不修改源代码的前提下,对类里面的方法进行增强 前置 后置 环绕 异常 创建项目前引入aop的包 <dependency>     <grou ...

  6. Spring AOP编程-传统aop开发总结

    1.编写目标对象(target) <!-- 目标target --><bean id="orderService" class="cn.nwtxxb.a ...

  7. 01-iOS蓝牙开发简介

    蓝牙开发简介 1.1-iOS蓝牙实现方案 iOS中提供了4个框架用于实现蓝牙连接 1.<GameKit.framework>:用法非常简单 只能用于iOS设备之间的连接,多用于蓝牙对战的游 ...

  8. OpenCV Java开发简介

    OpenCV Java开发简介 OpenCV Java开发简介 我们将在本指南中做什么 获得适当的OpenCV 下载 构建 Java示例与Ant Java和Scala的SBT项目 运行SBT样本 Op ...

  9. Ethereum 开发简介

    内容 Ethereum Web 开发 搭建开发者环境 EVM 与 Solidity 简介 Full Stack – 第一个 Dapp 传统的 Web 开发 简介 有一个后台服务,后台回去连接数据库,好 ...

  10. DotNetNuke模块开发简介

    本文为翻译内容,原文来自http://adefwebserver.com/DotNetNukeHELP/DNN4_ModuleDevelopersGuide/ 仅作参考,不是严格翻译(累了,脑袋不转了 ...

最新文章

  1. win计算机管理没有权限,Windows 7提示没有管理员权限怎么办
  2. SAP Table Relationship of Material Classification
  3. Django 中ORM 的使用
  4. Apache Shiro 使用手册(三)Shiro 授权
  5. UEditor文本浏览器,引号加斜杠解决
  6. java初学之stream
  7. 网信号好怎么不显示无服务器,苹果iPhone12经常出现无服务状态 信号不好怎么解决...
  8. 正则表达式的基本语法
  9. JAVA面试常考系列六
  10. threejs精灵(Sprite)
  11. win32键盘输入python_python-win32api键盘输入教程
  12. linux手动安装rsync_Linux中安装使用rsync | 学步园
  13. HDU1757:A Simple Math Problem(矩阵快速幂)
  14. 麻瓜编程python web百度网盘_麻瓜编程_Python Web开发工程师_附课程配套资料
  15. Android studio引入XUI
  16. 【编译原理】 CS143 斯坦福大学公开课 第一周:简介
  17. itest软件测试工具,itest(爱测试)
  18. 在html中通过使用css解决高度塌陷问题
  19. 理解Kotlin密封类Sealed
  20. zabbix随堂笔记

热门文章

  1. EasyNLP 中文文图生成模型带你秒变艺术家
  2. Android页面下拉列表的简单页面
  3. 矩形内部的正方形及长方形数目
  4. Arbotix+Rviz——基于Ubuntu20.04
  5. WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platfo
  6. Java转大数据开发全套视频资料
  7. 9008刷机 小米max2_小米手机9008短接图,可进行深度刷机解锁操作!―远程580快修...
  8. Springboot毕设项目操作系统的在线考试系统5woc7(java+VUE+Mybatis+Maven+Mysql)
  9. redis删除指定key以及清空库
  10. ubuntu16.04安装NVIDIA显卡驱动或者更换高版本显卡驱动详细(下载.run包方式)