Spring 实战 六: 什么是面向切面编程 + Spring 对 aop 的支持 + 通过切点选择连接器

软件系统中的一些功能需要应用到应用程序的多个地方,如日志、安全、缓存和声明式事务。

散布于应用中多处的功能被称为横切关注点,这些横切关注点从逻辑上与应用的业务逻辑相分离,但往往会直接嵌入到业务逻辑之中,把这些横切关注点从业务逻辑分离正是面向切面编程要解决的问题。

  1. 继承委托使对象体系变得复杂,切面提供了另一种更加清晰简洁的方案。
  2. 每个关注点都集中在一个地方,不用分散在代码中。
  3. 服务模块更简洁,因为他们只关注核心功能。

什么是面向切面编程

通知(Advice)

切面要完成的工作(什么),何时完成这个工作(何时)。

  1. before:前置通知
  2. After:后置通知
  3. After-returning:目标方法执行之后执行通知
  4. After-throwing:在目标方法抛出异常后执行通知
  5. Around:包裹了目标方法,在方法执行前和调用后执行通知
连接点(Join point)

应用执行过程中能够插入切面的点,切面可以利用这些点插入到正常业务逻辑之中,并添加新的行为。

切点(Poincut)

一个切面不需要通知应用的所有连接点,切点有助于缩小切面所通知的连接点的范围(何处)。

切面(Aspect)

切面是通知和切点的结合,通知和切点共同定义了切面的全部内容——切面要完成什么功能,在何时何处完成。

引入(Introduction)

向现有类添加新的方法或属性。

织入(Weaving)

织入把切面应用到目标对象并创建新的代理对象,切面在指定的连接点织入到目标对象,可在多个可选的对象声明周期里织入:
1. 编译期:需要特殊的编译器,如 AspectJ 的织入编译器
2. 类加载期:目标类加载到 JVM 时织入,需要特殊的类加载器(ClassLoader),增强目标类的字节码
3. 运行期:运行时,AOP 容器动态的为目标对象创建代理对象,如 Spring AOP

Spring 对 aop 的支持

spring 提供了 4 种 aop 支持
1. 基于代理的经典 spring aop
2. 纯 POJO 切面(POJO:Plain ordinary java object - java beans)
3. @AspectJ 注解驱动的切面
4. 注入式 AspectJ 切面

spring aop 构建在动态代理之上,所有spring 对 aop 的支持局限于方法拦截。

spring 在运行时通知对象
  1. spring 代理封装了目标类,并拦截被通知方法的调用,再把调用转发给真正的 bean,当代理拦截到方法调用时,在调用目标 bean 方法之前,会执行切面逻辑。
  2. spring运行时才创建代理对象,所以不需要特殊的编译器织入 spring aop 切面。

AspectJ 最初是以 java 语言扩展的方式实现的,有自己的编译器,除方法切点外,还提供了字段(拦截字段的修改)和构造器(构造器调用时)接入点。(JBoss 也提供了同样的粒度)

spring aop 与 AspectJ 项目
  1. spring aop 与 AspectJ 项目间有大量的协作,Spring 对 aop 的支持在很多方面借鉴了 AspectJ 项目(注解驱动、切点表达式语言的子集 …)
  2. spring 的 AspectJ 自动代理仅仅使用 @AspectJ 作为创建切面的指定,切面依然是基于代理的。这意味着尽管使用的是 @AspectJ 注解,我们还是限定于代理方法的调用,如果想利用 AspectJ 的所有能力,我们必须在运行时使用 AspectJ 并且不依赖 Spring 来创建基于代理的切面。

通过切点选择连接器

在 spring aop 中,要使用 AspectJ 的切点表达式语言来定义切点,spring 仅支持 AspectJ 切点指示器(pointcut designator)的一个子集。

AspectJ 指示器
  1. arg() 限制参数
  2. @args() 限制参数注解
  3. execution() 匹配连接点
  4. this() 限制代理的 bean 引用的类型
  5. target 限制目标对象类型
  6. @target() 限制目标对象类型,同时类型需要有特定注解
  7. within() 限制类型,包
  8. @within() …?
  9. annotation 限定注解
  10. bean() spring 提供的指示器,用于限定指定 bean
指示器使用
  1. “(..)” 表示不限定参数,”*” 任意返回值类型
  2. &&(and)、||(or)、!(not)
    image.png
    image.png
Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值