【Spring AOP】Spring AOP之你必须知道的AOP相关概念(1)
一、什么是AOP
AOP(Aspect-oriented Programming)即面向切面编程,是对OOP( Object-oriented Programming)即面向对象编程的一种补充,AOP是对程序结构的另一种思考。在OOP中的核心模块单元是Class类,而AOP中的核心单元是Aspect方面。Aspect方面支持跨多个Type类型和Object对象的关注点(例如事务管理)的模块化。(在AOP文献中,这样的关注点通常被称为“横切”关注点。)。
Spring提供了XML和@Aspect注解两种强有力的方式实现AOP。这两种风格都提供了完全类型化的advice和使用AspectJ pointcut 语言,来实现Spring AOP进行weaving编织。当然也可以通过更低级别的方式来实现,也就是通过底层API程序化实现。
Spring中的AOP主要体现在两个方面:
1.提供声明性企业服务。其中最重要的就是声明性事务管理。
2.让用户自己实现自定义的Aspects方面,来实现相关AOP的功能
二、AOP相关概念
让我们从定义一些核心的AOP概念和术语开始。这些术语不是特定于spring的。不幸的是,AOP术语不是特别直观。然而,如果Spring使用自己的术语,则会更加混乱。
1)Aspect(方面)
跨越多个类的横切关注点。在Spring AOP,事务管理是企业Java应用程序中横切关注点的一个很好的例子。可以通过@Aspect注解来实现一个Aspect类
2)Join point (连接点)
程序执行过程中的一个点也就是可以被拦截通知的地方,如方法的执行或异常的处理。在Spring AOP中,连接点总是表示方法执行。
3)Advice(通知)
在特定连接点上采取的操作。有不通类型的Advice,在Spring中有5种类型分别为Before,After,AfterReturning,AfterThrowing,Around。许多AOP框架,包括Spring,将通知建模为拦截器,并维护围绕连接点的拦截器链。
4)Pointcut (切入点)
匹配连接点的谓词。表示将通知与切入点表达式相关联,并在与切入点匹配的任何连接点上运行(例如,执行具有特定名称的方法)。连接点与切入点表达式匹配的概念是AOP的核心,Spring默认使用AspectJ切入点表达式语言。该概念的核心就是切入点表达式。
5)Introduction(介绍)
表示在不修改这个类的情况下,增加额外的方法或字段。Spring AOP允许您将新的接口(和相应的实现)引入任何被建议的对象。例如,您可以使用一个介绍来让一个bean实现一个IsModified接口,以简化缓存。(介绍在AspectJ社区中称为类型间声明。)
6)Target object (目标对象)
被一个或多个方面告知的对象。也称为“被通知对象”。
7)AOP proxy(AOP代理)
为了实现通知被AOP框架创建的代理对象。在Spring框架中,AOP代理是JDK动态代理或CGLIB代理。
8)Weaving(织入)
将方面与其他应用程序类型或对象链接以创建被通知的对象。这可以在编译时(例如,使用AspectJ编译器)、加载时或运行时完成。与其他纯Java AOP框架一样,Spring AOP在运行时执行编织。
三、通知类型介绍
1)Before advice
在被通知对象的方法调用之前执行,但是无法阻止被通知对象的方法被调用(除非抛异常)
2)After (finally) advice
被通知对象的方法调用完之后执行,无论被通知对象的方法以何种方式退出(正常或异常返回),都将执行通知。
3)After returning advice
被通知对象的方法正常完成后运行并可以拿到返回结果(如果一个方法没有抛出异常并返回)。
4)After throwing advice
如果一个方法通过抛出异常退出,则被执行
5)Around advice
围绕连接点(如方法调用)的通知。这是最有力的建议。Around通知可以在方法调用前后执行自定义行为。它还负责选择是继续到连接点,还是通过返回它自己的返回值或抛出异常来简化建议的方法执行。
【Spring AOP】Spring AOP之你必须知道的AOP相关概念(1)的更多相关文章
- 《你必须知道的.NET》读书笔记三:体验OO之美
此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.依赖也是哲学 (1)本质诠释:“不要调用我们,我们会调用你” (2)依赖和耦合: ①无依赖,无耦合 ...
- [你必须知道的.NET]第二十回:学习方法论
说在,开篇之前 本文,源自我回答刚毕业朋友关于.NET学习疑惑的回复邮件. 本文,其实早计划在<你必须知道的.NET>写作之初的后记部分,但是因为个中原因未能如愿,算是补上本书的遗憾之一. ...
- C#刨根究底:《你必须知道的.NET》读书笔记系列
一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...
- (转)【推荐】初级.NET程序员,你必须知道的EF知识和经验
转自:http://www.cnblogs.com/zhaopei/p/5721789.html [推荐]初级.NET程序员,你必须知道的EF知识和经验 阅读目录 [本文已下咒.先顶后看,会涨 ...
- 《你必须知道的.NET》读书笔记一:小OO有大智慧
此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.对象 (1)出生:系统首先会在内存中分配一定的存储空间,然后初始化其附加成员,调用构造函数执行初 ...
- 《你必须知道的.NET》读书笔记二:小OO有大原则
此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.单一职责原则 (1)核心思想:一个类最好只做一件事,只有一个引起它变化的原因 (2)常用模式:Fa ...
- 《你必须知道的.NET》读书笔记:从Hello World认识IL
通用的语言基础是.NET运行的基础,当我们对程序运行的结果有异议的时候,如何透过本质看表面,需要我们从底层来入手探索,这时候,IL便是我们必须知道的基础. 一.IL基础概念 1.1 什么是IL? IL ...
- MVC中你必须知道的13个扩展点
MVC中你必须知道的13个扩展点 pasting 转:http://www.cnblogs.com/kirinboy/archive/2009/06/01/13-asp-net-mvc-extensi ...
- 前端开发必须知道的JS(二) 闭包及应用
http://www.cnblogs.com/ljchow/archive/2010/07/06/1768749.html 在前端开发必须知道的JS(一) 原型和继承一文中说过下面写篇闭包,加之最近越 ...
随机推荐
- 【excel】=EXACT(A1,B1) 比较两个字符串是否相等
相等返回true 不相等返回false
- 【Linux】没有网的情况下如何安装GCC
一:GCC的概述 GCC是编译器集合 GCC是根据文件后缀分类编译的编译器集合 参考文档: https://blog.csdn.net/zl1zl2zl3/article/details/833739 ...
- <LinkedList> 160
160. Intersection of Two Linked Lists 分别从AB循环两次.如果第一次没循环到,第二次就会在节点相遇. public class Solution { public ...
- __str__与__repr__的触发顺序总结
1.__str__是个内置的方法,无需使用者去调用,其会在满足某一条件时自动触发.那么要触发它运行都有哪些条件呢? 有三种条件,分别为:print , str , %s 2.__repr__同样是个内 ...
- 【LG4437】[HNOI/AHOI2018]排列
[LG4437][HNOI/AHOI2018]排列 题面 洛谷 题解 题面里这个毒瘤的东西我们转化一下: 对于\(\forall k,j\),若\(p_k=a_{p_j}\),则\(k<j\). ...
- impala入门
一.概述 Impala 是参照google 的新三篇论文Dremel(大批量数据查询工具)的开源实现,功能类似shark(依赖于hive)和Drill(apache),impala 是clouder ...
- [LeetCode] 780. Reaching Points 到达指定点
A move consists of taking a point (x, y) and transforming it to either (x, x+y) or (x+y, y). Given a ...
- 关于Windows自动化卸载软件的思路
思路 关于控制面板“卸载”关联到的exe是这样的: 注册表:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall ...
- markdown格式接口文档模板
源文件 https://files.cnblogs.com/files/bincoding/%E6%8E%A5%E5%8F%A3%E6%96%87%E6%A1%A3.zip 目录 测试接口 查询指定项 ...
- Jquery表单插件使用
一般表单提交都是同步,可以使用$.post进行异步提交,但这样意味着当表单属性很多的时候,要写的js也很多($("#xxx").val()获取属性的值后,在放入$.post第二个参 ...