AOP----开发简介
文章目录
- 一些术语
- 开发的注意事项
- 开发快速入门
- 切点表达式的写法
- 切点表达式的抽取
- 通知的类型
一些术语
Spring的AOP实现底层就是对上面的动态代理的代码进行了封装,封装后我们只需要对需要关注的部分进行代码编写,并通过配置的方式完成指定目标的方法增强。
AOP的相关术语,常用的术语如下:
Target (目标对象) :代理的目标对象,其中的方法被称为目标方法
Proxy (代理) :一个类被AOP织入增强后,就产生一个结果代理类
Joinpoint (连接点) :所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点。在这里,简单来说,连接点就是可以被进行配置增强的方法
Pointcut (切入点) :所谓切入点是指我们要对哪些Joinpoint进行拦截的定义。这里简单来说,就是被配置增强的目标方法
Aope (通知/增强) :所谓通知是指拦截到linpont之后所要做的事情就是通如。简单来说,就是我们的增强方法。
Aspect (切面) :是切入点和通知(增强)的结合。就是,增强方法和被配置了增强的目标方法的结合体
Weaving (织入) :是指把增强应用到目标对象来创建新的代理对象的过程。spring采用动态代理织入,而Aspect采用编译期织入和类装载期织入。就是指,把切入点和通知的结合过程就是织入
开发的注意事项
- 需要编写的内容:
编写核心业务代码(目标类的目标方法)
编写切面类,切面类中有通知(增强功能方法)
在配置文件中,配置织入关系,即将哪些通知与哪些连接点进行结合 - AOP技术实现的内容:
Spring框架监控切入点方法的执行。 一旦监控到切入点方法被运行,使用代理机制,动态创建目标对象的代理对象,根据通知类别,在代理对象的对应位置,将通知对应的功能织入,完成完整的代码逻辑运行。即,我们写切入点,和通知,然后给这俩形成切面。然后当程序运行到切入点对应的增强方法的时候,程序会自动根据切面生成代理对象,在生成代理对象的时候,会在对应位置将通知对应的功能织入
- AOP底层使用哪种代理方式
在spring中,框架会根据目标类是否实现了接口来决定采用哪种动态代理的方式。有接口用JDK的,无接口,用cglib的
开发快速入门
这里,一个基于XMl配置文件的简单实现
步骤:
1:导入AOP相关包坐标,这里,我们不仅要导入Spring的相关坐标,我们还要导入一个aspectjweaver的包的坐标。为啥?因为这个包实现AOP思想的方式比Spring自带的实现方式更好,所以spring就推荐开发者用这个。
2:创建目标接口和目标类(内部有切点)
3:创建切面类(不是增强类,切面类内部有增强方法)
4:将目标类和切面类的对象创建权交给spring
5:在applicationContextxml中配置织入关系
6:测试代码
- 导入这四个需要的包:
<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>
- 创建目标接口和目标类(内部有切点)
- 创建切面类(不是增强类,切面类内部有增强方法)
- 将目标类和切面类的对象创建权交给spring
就是简单的配置Bean - 在applicationContextxml中配置织入关系
记得先引入aop的命名空间,这里的引入方式和引入context命名空间的方式一样,就只是修改beans
- 测试代码
创建一个测试类
通过这样的方式来进行测试
切点表达式的写法
表达式语法:
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属性来引用抽取后的切点表达式。
比如:
通知的类型
有这么几种:其实具体是这样的
- 环绕通知:
- 异常抛出通知:
这里定义一个会出现异常的方法(切点):
然后这里一个处理异常的方法(通知):
配置:
然后调用:
然后:通知进行了执行
AOP----开发简介相关推荐
- aop简介-aop开发明确的事
AOP 开发明确的事项 1)需要编写的内容 编写核心业务代码(目标类的目标方法) 编写切面类,切面类中有通知(增强功能方法) 在配置文件中,配置织入关系,即将哪些通知与哪些连接点进行结合 2)AOP ...
- 关于框架Spring------学习的第三天(AOP开发)
Spring关于AOP开发的相关知识 1.Spring 的 AOP 简介 1.1 什么是 AOP 1.2 AOP 的动态代理技术 1.3 JDK 的动态代理 1.4 cglib 的动态代理 1.5 A ...
- 网络增强现实开发简介 Introduction to Web AR development
搭配webXR.mindAR.three.js和tensorflow.js 你会学到: 获得构建不同类型的网络增强现实应用程序的实践经验,包括图像效果.人脸效果和世界效果 获得关于增强现实如何在网络浏 ...
- 【Flutter】Flutter 混合开发 ( 简介 | Flutter 混合开发集成步骤 | 创建 Flutter Module )
文章目录 一.Flutter 混合开发简介 二.Flutter 混合开发集成步骤 三.创建 Flutter Module 1.使用命令行创建 Flutter Module 项目 ( 仅做参考 ) 2. ...
- AOP开发——在不修改源代码的前提下,对类里面的方法进行增强 : 前置 后置 环绕 异常||如何得到目标方法的参数和返回值
AOP开发 @Transactionl 在不修改源代码的前提下,对类里面的方法进行增强 前置 后置 环绕 异常 创建项目前引入aop的包 <dependency> <grou ...
- Spring AOP编程-传统aop开发总结
1.编写目标对象(target) <!-- 目标target --><bean id="orderService" class="cn.nwtxxb.a ...
- 01-iOS蓝牙开发简介
蓝牙开发简介 1.1-iOS蓝牙实现方案 iOS中提供了4个框架用于实现蓝牙连接 1.<GameKit.framework>:用法非常简单 只能用于iOS设备之间的连接,多用于蓝牙对战的游 ...
- OpenCV Java开发简介
OpenCV Java开发简介 OpenCV Java开发简介 我们将在本指南中做什么 获得适当的OpenCV 下载 构建 Java示例与Ant Java和Scala的SBT项目 运行SBT样本 Op ...
- Ethereum 开发简介
内容 Ethereum Web 开发 搭建开发者环境 EVM 与 Solidity 简介 Full Stack – 第一个 Dapp 传统的 Web 开发 简介 有一个后台服务,后台回去连接数据库,好 ...
- DotNetNuke模块开发简介
本文为翻译内容,原文来自http://adefwebserver.com/DotNetNukeHELP/DNN4_ModuleDevelopersGuide/ 仅作参考,不是严格翻译(累了,脑袋不转了 ...
最新文章
- win计算机管理没有权限,Windows 7提示没有管理员权限怎么办
- SAP Table Relationship of Material Classification
- Django 中ORM 的使用
- Apache Shiro 使用手册(三)Shiro 授权
- UEditor文本浏览器,引号加斜杠解决
- java初学之stream
- 网信号好怎么不显示无服务器,苹果iPhone12经常出现无服务状态 信号不好怎么解决...
- 正则表达式的基本语法
- JAVA面试常考系列六
- threejs精灵(Sprite)
- win32键盘输入python_python-win32api键盘输入教程
- linux手动安装rsync_Linux中安装使用rsync | 学步园
- HDU1757:A Simple Math Problem(矩阵快速幂)
- 麻瓜编程python web百度网盘_麻瓜编程_Python Web开发工程师_附课程配套资料
- Android studio引入XUI
- 【编译原理】 CS143 斯坦福大学公开课 第一周:简介
- itest软件测试工具,itest(爱测试)
- 在html中通过使用css解决高度塌陷问题
- 理解Kotlin密封类Sealed
- zabbix随堂笔记
热门文章
- EasyNLP 中文文图生成模型带你秒变艺术家
- Android页面下拉列表的简单页面
- 矩形内部的正方形及长方形数目
- Arbotix+Rviz——基于Ubuntu20.04
- WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platfo
- Java转大数据开发全套视频资料
- 9008刷机 小米max2_小米手机9008短接图,可进行深度刷机解锁操作!―远程580快修...
- Springboot毕设项目操作系统的在线考试系统5woc7(java+VUE+Mybatis+Maven+Mysql)
- redis删除指定key以及清空库
- ubuntu16.04安装NVIDIA显卡驱动或者更换高版本显卡驱动详细(下载.run包方式)