• 概述
  • AOP是什么
  • AOP专业术语
    • 连接点Joinpoint
    • 切点Pointcut
    • 增强Advice
    • 目标对象Target
    • 引介Introduction
    • 织入Weaving
    • 代理Proxy
    • 切面Aspect
  • AOP的实现者
    • AspectJ
    • AspectWerkz
    • JBoss AOP
    • Spring AOP

概述

Spring AOP是AOP技术在Spring中的具体实现,它是Spring框架的另外一个重要基石。

Spring构建于IOC之上,和IOC浑然天成,统一于Spring容器之中。

AOP是什么

AOP的出现并不是要取代面向对象编程OOP(Object-oriented programming),而是作为OOP的有益补充。

AOP是有特定的应用场合的,它只适合那些具有横切逻辑的应用场合,比如性能监测、访问控制、事务管理以及日志记录等。

AOP(Aspect-oriented programming)面向切面编程。

按照软件重构思想的理念,如果多个类中出现了相同的代码,则应该考虑定义一个父类,将这些相同的代码提取到父类中。 比如 Dog、Cat、Pig都有run()和eat()方法,通过引入一个包含这两个方法的抽象的Animal父类,Dog、Cat、Pig就可以通过继承Animal复用run()和eat()方法方法。


代码已托管到Github—> https://github.com/yangshangwei/SpringMaster

通过引入父类消除多个类中重复代码的方式在大多数情况下是可行的,但有的时候并非可以解决,比如:

ForumService.java

package com.xgj.aop.introduce;public class ForumService {private TransactionManager transManager;private PerformanceMonitor pmonitor;private TopicDao topicDao;private ForumDao forumDao;public void removeTopic(int topicId) {// 性能监视开始pmonitor.start();// 事务开始transManager.beginTransaction();// (1)业务代码topicDao.removeTopic(topicId);// 事务结束transManager.endTransaction();// 性能监视结束pmonitor.end();}public void CreateForum(Forum forum) {pmonitor.start();transManager.beginTransaction();// (2)业务代码forumDao.create(forum);transManager.endTransaction();pmonitor.end();}
}

我们发现(1)(2)两处真正的业务代码被 性能监视代码 和 事务方法的所包围。 业务代码淹没在重复化非业务性的代码之中。 性能监视和事务管理这些非业务性代码葛藤缠树般包围业务代码。

如果将ForumService业务类看做一段圆木, 将removeTopic()和createForum()方法分别看成圆木的一截,会发现性能监视和事务管理的代码就像一个年轮,而业务代码就是圆木的树心,这也是横切代码概念的由来。

横切逻辑示意图:

我们无法通过抽象父类的方式消除如上重复性横切代码,因为这些横切逻辑依附在业务类方法的流程中,它们不能转移到其他地方去。

AOP独辟蹊径,通过横向抽取机制为这类无法通过纵向继承体系进行抽象的重复性代码提供了解决方案。

横向抽取:

从上图可以看出: AOP希望将这些分散在各个业务逻辑代码中的相同代码通过横向切割的方式抽取到一个独立的模块中,还业务逻辑一个清新的世界。

当然,将这些重复性的横切逻辑独立出来是容易的,但是如何将这些独立的逻辑融合到业务逻辑中以完成和原来一样的业务流程,这才是关键,这也是AOP要解决的主要问题


AOP专业术语

连接点Joinpoint

连接点是程序执行的某个特定位置。比如类初始化前、类初始化后、类的某个方法调用前\调用、方法抛出异常后等。

一个类或者一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点被称为“连接点”

Spring仅支持方法的连接点,即仅仅能在方法调用前、调用后、方法抛出异常时以及方法调用前后这些程序执行点织入增强。

连接点由两个信息确定:

  • 一是用方法标识的程序执行点
  • 二是用相对位置标识的方位

比如Test.foo()方法执行前的连接点,执行点为Test.foo(),方位为该方法执行前的位置。 Spring使用切点对执行点进行定位,而方位则在增强类型中定义。


切点Pointcut

每个程序类都拥有多个连接点,比如拥有两个方法的类,这两个方法都是连接点。

在众多的连接点中,如何定位我们需要的连接点呢? AOP通过“切点”定位特定的连接点。

一个切点可以匹配多个连接点。

在Spring中,切点通过 org.springframework.aop.Pointcut接口类进行描述,它使用类和方法作为连接点的查询条件,Spring AOP的规则引擎负责解析切点所设定的查询条件,找到对应的连接点。

确切的说,应该是执行点而非连接点,因为连接点是方法执行前、执行后等包含方位信息的具体程序执行点, 而切点只是定位到某个方法上, 如果希望定位到具体的连接点上,还需要提供方位信息,


增强Advice

增强是织入目标类连接点上的一段程序代码。

在Spring中,增强除了用于描述一段程序代码外,还拥有另一个和连接点相关的信息,这便是执行点的方位。 结合执行点的方位信息和切点信息,就可以找到特定的连接。

正是因为增强既包含用于添加到目标连接点上的一段执行逻辑,又包含用于特定连接点的方位信息,所以Spring提供的增强接口都是带方位名的,比如BeforeAdvice、AfterReturningAdvice、ThrowsAdvice等。

所以只有结合切点和增强,才能确定特定的连接点并实施增强逻辑。


目标对象Target

增强逻辑的织入目标类。

如果没有AOP,业务目标类需要自己实现所有的逻辑,如最上面的代码(性能测试和事务管理)。 在AOP的帮助下,ForumService只需要试下那些非横切逻辑的程序逻辑,而性能监视和事务管理等这些横切逻辑则可以使用AOP动态织入特定的连接点上。


引介Introduction

引介是一种特殊的增强,它为类添加一些属性和方法。

这样,即使一个业务类原本没有实现某个接口,通过AOP的引介功能,也可以动态的为该业务类添加接口的实现逻辑,让业务类成为这个接口的实现类。


织入Weaving

织入是将增强添加到目标的具体连接点上的过程。

AOP有三种织入方式

  1. 编译期织入,这要求使用特殊的Java编译器
  2. 类装载期织入,这要求使用特殊的类装载器
  3. 动态代理织入,在运行期为目标类添加增强生成子类的方式

Spring采用动态代理织入 ,而AspectJ 采用编译期织入和装载期织入


代理Proxy

一个类被AOP织入增强后,就产生了一个结果类,它是融合了原类和增强逻辑的代理类。


切面Aspect

切面由切点和增强(引介)组成。它既包括横切逻辑的定义,也包括连接点的定义。

SoringAOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入切面所指定的连接点中。

AOP的工作重心在于如何将增强应用于目标对象的连接点上。 主要包括两点:

  1. 第一如何通过切点和增强定位到连接点上
  2. 第二如何在增强中编写切面的代码

AOP的实现者

AspectJ

AspectJ是目前最完善的AOP语言,对Java编程语言进行了扩展,定义了AOP语法,能够在编译期提供横切代码的织入。AspectJ提供了两种横切实现机制,一种称为动态横切(Dynamic Crosscuting),另一种成为静态横切(Static Crosscuting)


AspectWerkz

基于java的简单、动态和轻量级的AOP框架,支持运行期或者类装载期织入横切代码,它拥有一个特殊的类装载器。他与AspectJ项目已经合并,第一个发行版是AspectJ5。扩展AspectJ语言,以基于注解的方式支持类似AspectJ的代码风格。


JBoss AOP

JBoss是一个开源的符合J2EE规范的应用服务器,作为J2EE规范的补充,JBoss中引入了AOP框架,为普通Java提供了J2EE服务,而无需遵循EJB规范。JBoss通过类载入时,使用Javassis对字节码操作实现动态AOP框架。


Spring AOP

Spring AOP使用纯Java实现,不需要专门的编译过程,不需要特殊的类装载器,他在运行期通过代理方式向目标类织入增强代码。Spring并不尝试提供最完整的AOP实现,主要侧重一种和Spring IoC容器整合的AOP实现,以解决企业级开发中的常见问题。

Spring-AOP概述相关推荐

  1. Spring AOP概述及底层实现原理

    Spring AOP概述及底层实现原理 aop概述 AOP全称为Aspect Oriented Programming的缩写,意为:面向切面编程.将程序中公用代码进行抽离,通过动态代理实现程序功能的统 ...

  2. spring AOP 概述(一) Advice

    Advice通知 Advice(通知)定义在连接点做什么,为切面增强织入接口.在Spring AOP中,它主要描述Spring AOP 围绕方法调用而注入的切面行为.Advice是AOP联盟定义的一个 ...

  3. Spring Aop 组件概述

    Spring Aop 概述 AOP(Aspect-Oriented Programming) 面向切面编程, 这种编程模型是在 OOP(Object-Oriented Programming) 的基础 ...

  4. 【小家Spring】Spring AOP各个组件概述与总结【Pointcut、Advice、Advisor、Advised、TargetSource、AdvisorChainFactory...】

    每篇一句 基础技术总是枯燥但有价值的.数学.算法.网络.存储等基础技术吃得越透,越容易服务上层的各种衍生技术或产品 相关阅读 [小家Spring]Spring AOP原理使用的基础类打点(AopInf ...

  5. Spring AOP示例教程 - Aspect,Advice,Pointcut,JoinPoint,Annotations,XML Configuration

    Spring AOP示例教程 - Aspect,Advice,Pointcut,JoinPoint,Annotations,XML Configuration Spring Framework是基于两 ...

  6. Spring AOP知识详解

    本文来详细说下spring中的aop内容 文章目录 Spring AOP概述 Spring AOP一代 Pointcut Jointpoint Advice Advisor 织入 Spring AOP ...

  7. 《Spring揭秘》读书笔记 2:Spring AOP

    7 一起来看AOP 2009年8月,<一起来看流星雨>开播. 2009年9月,<Spring揭秘>出版. 7.1 AOP核心概念 AOP AOP全称为Aspect-Orient ...

  8. Spring技术内幕(3)Spring AOP的实现

    本章内容 Spring AOP概述.Spring AOP的设计与实现.建立AopProxy代理对象.Spring AOP拦截器调用的实现.Spring AOP的高级特性. 3.1 Spring AOP ...

  9. Spring aop面向切面编程概述

    aop概述 1.AOP为Aspect Oriented Programming的缩写,意为:面向切面编程.将程序中公用代码进行抽离,通过动态代理实现程序功能的统一维护的一种技术.使代码耦合性降低,提高 ...

  10. Spring AOP 增强框架 Nepxion Matrix 详解

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 概述 在<深入聊一聊 Spring AOP 实现机制>一文中,介绍了 Spring A ...

最新文章

  1. 特斯拉线圈的阻抗分析
  2. 【Ubuntu入门到精通系列讲解】常用其他命令(find ln tar apt)等速查
  3. 最佳5本Java性能调优书籍–精选,必读
  4. 汽车电子专业知识篇(一)-汽车行业质量人必知的41个体系术语
  5. Qt字符串转日期时间-毫秒
  6. JQUERY--图片轮换superslide(
  7. 简述tcp协议三报文握手过程_TCP协议的3次握手与4次挥手过程详解
  8. 莫兰指数stata命令_一文读懂16个sp系列stata空间计量命令及应用
  9. python计算方位角_python如何计算方位角 python计算方位角代码实例
  10. Intelligent IME
  11. vue将图片保存到相册_vue 图片下载到本地,图片保存到本地
  12. 爬虫:信息提取的一般方法
  13. 最全面计算机英语核心单词分享
  14. 人人都是网站分析师(从分析师视角理解网站和解读数据)-读书笔记4(完结)
  15. 使用docker安装mysql8及mysql5.7
  16. python绘制樱花洒落_Python:绘制樱花树
  17. C++ 求绝对值函数abs()
  18. 今日金融词汇---新股限购,是什么?
  19. 【自动驾驶】杜明芳:基于多尺度IPM图的车道线检测实现
  20. 书是怎样写成的——《ASP.NET夜话》背后的故事

热门文章

  1. python super 理解(四)
  2. mongodb转json
  3. Leetcode 349. 两个数组的交集 (每日一题 20211014)
  4. DeepLab v2的摘要部分(翻译加理解)
  5. 拉格朗日插值法的MATLAB源程序
  6. Windows上搭建Python安装包MySQLdb
  7. matlab R2010a windows和linux版本下载地址
  8. numpy.exp详解
  9. 详解下一代神经网络-无监督对比学习框架SimCLR
  10. 运满满的技术架构演进之路