Spring AOP 面向切面编程

AOP

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

在Spring中提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。

AOP使用场景

  • Authentication 权限
  • Caching 缓存
  • Context passing 内容传递
  • Error handling 错误处理
  • Lazy loading 懒加载
  • Debugging  调试
  • logging, tracing, profiling and monitoring 记录跟踪 优化 校准
  • Performance optimization 性能优化
  • Persistence  持久化
  • Resource pooling 资源池
  • Synchronization 同步
  • Transactions 事务

AOP的术语

 

  1. 通知(Advice):

通知定义了切面是什么以及何时使用。描述了切面要完成的工作和何时需要执行这个工作。

通知就是切面中除去切点之外的部分。如在方法执行前触发,执行后触发,异常时触发,以及触发那个方法。

2.连接点(Joinpoint):

程序能够应用通知的一个"时机",这些"时机"就是连接点,例如方法被调用时、异常被抛出时等等。

连接点是通知的一部分。

3.切入点(Pointcut)

通知定义了切面要发生的"故事"和时间,那么切入点就定义了"故事"发生的地点,例如某个类或方法的名称,spring中允许我们方便的用正则表达式来指定

切入点定义在哪些类的那些方法上执行。

4.切面(Aspect)

通知和切入点共同组成了切面:时间、地点和要发生的"故事"

切面就时被标注了@Aspect注解的整个类要做的功能。包含定义切点,连接点,以及要触发的操作。

5.引入(Introduction)

引入允许我们向现有的类添加新的方法和属性(Spring提供了一个方法注入的功能)

6.目标(Target)

即被通知的对象,如果没有AOP,那么它的逻辑将要交叉别的事务逻辑,有了AOP之后它可以只关注自己要做的事(AOP让他做爱做的事)

目标是概念吧 不应该有目标这种配置 因为目标是在切点里通过表达式配置的。

7.代理(proxy)

应用通知的对象,详细内容参见设计模式里面的代理模式

这也是个概念,是内部实现的逻辑。代理是spring为了实现AOP为采用的一种方式。

8.织入(Weaving)

把切面应用到目标对象来创建新的代理对象的过程,织入一般发生在如下几个时机:

(1)编译时:当一个类文件被编译时进行织入,这需要特殊的编译器才可以做的到,例如AspectJ的织入编译器

(2)类加载时:使用特殊的ClassLoader在目标类被加载到程序之前增强类的字节代码

(3)运行时:切面在运行的某个时刻被织入,SpringAOP就是以这种方式织入切面的,原理应该是使用了JDK的动态代理技术

看看另外一种解释,更加通俗易懂:

  • 什么是面向切面编程

横切关注点:影响应用多处的功能(安全、事务、日志)

  • 切面:

横切关注点被模块化为特殊的类,这些类称为切面

优点:

每个关注点现在都集中于一处,而不是分散到多处代码中 
服务模块更简洁,服务模块只需关注核心代码。

AOP 术语

  • 通知: 

定义:切面也需要完成工作。在 AOP 术语中,切面的工作被称为通知。

工作内容:通知定义了切面是什么以及何时使用。除了描述切面要完成的工作,通知还解决何时执行这个工作。

Spring 切面可应用的 5 种通知类型:

Before——在方法调用之前调用通知

After——在方法完成之后调用通知,无论方法执行成功与否

After-returning——在方法执行成功之后调用通知

After-throwing——在方法抛出异常后进行通知

Around——通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为

  • 连接点: 

定义:连接点是一个应用执行过程中能够插入一个切面的点。

连接点可以是调用方法时、抛出异常时、甚至修改字段时、

切面代码可以利用这些点插入到应用的正规流程中

程序执行过程中能够应用通知的所有点。

  • 切点: 

定义:如果通知定义了"什么"和"何时"。那么切点就定义了"何处"。切点会匹配通知所要织入的一个或者多个连接点。

通常使用明确的类或者方法来指定这些切点。

作用:定义通知被应用的位置(在哪些连接点)

  • 切面: 

定义:切面是通知和切点的集合,通知和切点共同定义了切面的全部功能——它是什么,在何时何处完成其功能。

  • 引入: 

引入允许我们向现有的类中添加方法或属性

  • 织入: 

织入是将切面应用到目标对象来创建的代理对象过程。

切面在指定的连接点被织入到目标对象中,在目标对象的生命周期中有多个点可以织入

编译期——切面在目标类编译时期被织入,这种方式需要特殊编译器。AspectJ的织入编译器就是以这种方式织入切面。

类加载期——切面在类加载到

JVM ,这种方式需要特殊的类加载器,他可以在目标类被引入应用之前增强该目标类的字节码。AspectJ5 的 LTW 就支持这种织入方式

运行期——切面在应用运行期间的某个时刻被织入。一般情况下,在织入切面时候,AOP 容器会为目标对象动态的创建代理对象。Spring AOP 就是以这种方式织入切面。

 

Spring提供了4种实现AOP的方式:

  1. 经典的基于代理的AOP 这种已经过时了
  2. 纯POJO切面 通过xml配置aop来实现切面 java类就是纯pojo
  3. @AspectJ注解驱动的切面 通过Aspect注解来实现aop,只是使用AspectJ的注解,内部实现仍然是基于代理的。
  4. 注入式AspectJ切面 这个就是使用AspectJ了。上面三种都是spring aop的变体,也就是基于动态代理的aop。所以无法拦截如属性和构造器这种特殊的部分,如果有这种需求,要使用注入式AspectJ切面。

可以说上面123是Spring的AOP,第4个是AspectJ的了。关于Spring的AOP:

  • Spring的通知是java类编写的。AspectJ需要学习它自定义的语法。
  • Spring在运行时通知对象,而且不需要特殊的编译器来织入Spring AOP。
  • Spring只支持方法级别的连接点。

Spring 使用AspectJ的切点表达式来定义切面:

AspectJ 指示器

描述

arg ()

限制连接点的指定参数为指定类型的执行方法

@args ()

限制连接点匹配参数由指定注解标注的执行方法

execution ()

用于匹配连接点的执行方法

this ()

限制连接点匹配 AOP 代理的 Bean 引用为指定类型的类

target ()

限制连接点匹配特定的执行对象,这些对象对应的类要具备指定类型注解

within()

限制连接点匹配指定类型

@within()

限制连接点匹配指定注释所标注的类型(当使用 Spring AOP 时,方法定义在由指定的注解所标注的类里)

@annotation

限制匹配带有指定注释的连接点

1. 创建自己的切点 
 
- execution( ) 指示器选择 Instrument 的 play( ) 方法。 
方法表达式是以 * 号开头,标识了我们不关心的方法返回值的类型。 
* 后我们指定了权限定类名和方法名。 
对于方法的参数列表,使用(..)标识切点选择任意的 play( ) 方法,无论入参是什么。 
- 假设我们需要匹配切点仅匹配 com.Springinaction.springidol 包。可以使用 within() 
 
注意 && 是将 execution( ) 和 within( ) 连接起来,形成的 and 关系。同理也可以使用 || 或关系、!非关系 
- 创建 spring 的 bean( ) 指示器 
Spring 2.5 引入一个新的 bean( ) 指示器,该指示器允许我们在切点表达式中使用 Bean ID 来标识 Bean 
bean( ) 使用 Bean ID 或 Bean 名称作为参数来限制切点只匹配特定 Bean。 
如下,我们希望执行 Instrument 的 play( ) 方法时候应用通知,但限定 Bean 的 ID 为 eddie 
 
还可以使用非操作作为除了指定 ID 的 Bean 以外的其他 Bean应用通知 
 
在此场景下,切面会通知被编织到所有 ID 不为 eddie 的 Bean 中

 

转载于:https://www.cnblogs.com/xiaolang8762400/p/7020525.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/269165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

遥感图像增强方法应用

黄永璘 (广西气象减灾研究所 广西南宁 530022) 1、引 言  人类从眼睛获取信息占人体器官获取信息的90%以上,虽然人眼能看到很多东西,但其实我们看到的只是波长为0.38~0.8μm可…

3D Mapping with an RGB-D Camera(RGBD SLAM V2 )论文笔记

这篇文章即是Felix Endres等人12年完成的RGB-D SLAM V2,是最早的为kinect风格传感器设计的SLAM系统之一 没看到有相关的论文解析 在Github上可找到开源代码,工程配置与运行参考http://www.cnblogs.com/voyagee/p/6898278.html 系统流程 系统分为前后端。…

mysql内连接

假设a表和b表的数据是这样的。 a表 id name   1  a 2 b 3 c b表 id stock  1 15 2 50   select * from …

制作新网络框架快速自动生成消息结构体的编辑器

这两天制作了一个自动生成代码脚本的窗体编辑器 目前还没有做过第一行可以选择生成的脚本类型,分请求消息和回应消息两种结构体脚本 第二行可以手动输入命名空间,第三行手动输入文件的名称,类名与文件名称相同 后面两个ID是消息的ID 下面的Po…

随心所欲的Web页面打印技术

一.概述 对基于B/S架构的应用程序而言,客户端的页面打印一直是比较头疼的问题,简单的做法是:1.使用IE的打印功能;2.使用水晶报表。但以上两种办法,都有很大的局限性,很难实现特殊要求的排版和精确的定位&…

OAuth2.0学习(2-1)Spring Security OAuth2.0 开发指南

开发指南:http://www.cnblogs.com/xingxueliao/p/5911292.htmlSpring OAuth2.0 提供者实现原理:Spring OAuth2.0提供者实际上分为:授权服务 Authorization Service.资源服务 Resource Service.虽然这两个提供者有时候可能存在同一个应用程序中…

SQL的连接分为三种:内连接、外连接、交叉连接

建了两张表,学生表student 课程表 class 一、内连接: 内连接(INNER JOIN):有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。(所谓的链接表就是数据库在做查询形…

jion连接总结

1:内连接 2:左外连接 3:右外连接 4:左外连接 where判断 5:右外连接 where 6:全外连接 7:全外连接 where

福禄克网络电缆测试仪LinkIQ网络电缆测试仪的使用方法

作为福禄克官方授权经销商—明辰智航将给你一个完整的LinkIQ有线网络测试仪概述。首先,让我们来看看基本工具包里的内容。 我们有: LinkIQ本身 福禄克随身携带便捷包 快速参考指南说明书 CAT6a接线 远程ID 1用于完整的导线图测试 RJ45-to-RJ45模块…

步步为营-77-Ajax简介

AJax:异步JavaScript和XML.Asynchronous JavaScript and XML 优点:无刷新 1 JavaScript下的Ajax 1.1 XMLHttpRequest对象  使用ajax有一个很重要的对象XMLHttpRequest,而该对象的创建方式 var xhr new XMLHttpRequest();//常用 var xhr new ActiveXObject("Microsoft…

福禄克Link IQ功能:PoE负载测试及故障排除

自从最初的IEEE 802.3af 1型以太网供电(PoE)标准于2003年首次推出以来,该技术已经发展到包括2型(高达30瓦)、3型(高达60瓦)和4型(高达90瓦)。这意味着PoE电压现在支持从手…

利用局域网测试仪进行网络性能测试

随着互联网科技的飞速发展,网络变的越来越庞大,数据量越来越高,网络速率成几何倍数增长,网络应用也越来越复杂,对网络的性能、稳定性和可靠性都提出了更高的要求。在日益复杂的网络环境中一旦发生网络故障,…

详解-制作根文件系统,并使用yaffs,jffs,nfs挂载系统(2)

1.安装mkyaffsimage, mkyaffs2image命令(用来制作yaffs文件系统) 第一个命令针对Flash小页512B,第二个针对Flash大页2KB首先下载压缩文件 yaffs_source_util_larger_small_page_nand.tar.bz2安装mkyaffs2image命令为例: tar –xjf yaffs_source_util_larger_small_page_nand.ta…

数据中心综合布线时,使用交叉连接和互连的好处?

数据中心中,在交换机之间或交换机与服务器之间,为了灵活性和方便管理,有源设备之间都是使用交叉连接和通过配线架互联。在一些场合,还有的要求在同一通道内使用多个交叉连接或互联。 大多数人都知道,永久链路是通道的…

Oracle 通过出生日期计算年龄

sysdate 为系统日期时间,BIRTH_DATE 为表中出生日期字段 SELECTCOUNT( * ) FROMBARN_SWALLOW_INFO WHEREVALID_FLAG 1 AND IS_JINQIAO 1 AND TRUNC( months_between( SYSDATE, BIRTH_DATE ) / 12 ) > 25 AND TRUNC( months_between( SYSDATE, BIRTH_DATE )…

网站如何集成百度UEditor编辑器

在平时的网站维护使用过程中,富文本编辑器是网站必不可少的元素之一。现在市面上各种编辑器功能设计参差不齐,自己做了几个网站都是用蝉知建站系统做的,而蝉知默认内置的编辑器是KindEditor,功能简单,已经满足不了我的…

福禄克DSX系列教你如何测试铜缆跳线和光纤跳线

无论是用于在数据中心的光纤配线区和交换机之间进行连接的光纤跳线,还是用于将终端设备连接到工作区插座的局域网中的铜跳线,跳线都是网络不可或缺的一个组成部分,而跳线通常也是网络中最脆弱的环节。它比其他任何部件都更容易受到损坏。 由于…