1.AOP的概念

AOP(AspectOriented Programming,面向切面编程)指的是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下个程序动态统一添加功能的一种技术。AOP提供从一个角度来考虑程序结构以完善面向对象编程。它为开发人员提供了一种描述横切关注点的机制,并能够自动将横向关注点入到面向对象的软件系统中,从而实现了横切关注点模块化

AOP一般用于实现那些与业务无关,但是业务模块所共同调用的逻辑,例如异常拦截、事务管理、日志管理和权限控制等,AOP将这些代码封装起来,有利于减少系统的重复代码,降低模块间耦合度,提供可维护性。

AOP的基本概念:Aspect(切面):一个关注点的模块化,这个关注点可能会横切多个对象;Joinpoint(连接点):程序执行过程中某个特定的点,比如处理异常的时候;Advice(通知):在切面的某个特定连接点上执行的操作;Pointcut(切入点):匹配连接点的断言;Introduction(引入):用来给一个类型声明额外的方法和属性;Target Object(目标对象):被一个或多个切面所统治的对象;Weaving(织入):被切面连接到其他应用程序类型或对象上,并创建被通知的对象。

2.AOP的实现原理

AOP的核心实现与IoC一样依赖于Java的反射机制,但是与IoC不同的地方是,IoC用到的相关设计模式是工程模式,而AOP用到的是代理模式。代理模式的思想是不让外部直接访问具体目标,而是需要通过一个代理类才能访问,所有与具体目标的通信都能通过这道“隔离层”来传送请求或返回状态。

3.AOP的通知类型

/*

1、Before advice(前置通知):在方法执行之前执行,在一个切面里使用@Before

注解声明通知。配置参考示例如下:

*/

<bean id="afterReturningAdviceExample" class="完整类名" />

<aop:config proxy-target-class="false">

<!-- 定义切入点 -->

<aop:pointcut type="aspectj" id="beforePointcut"

exception="execution(*com.itjob.spring.aop..*Manager.*(..))"/>

<!-- 定义切面 -->

<aop:aspect ref="beforeAdviceExample">

<aop:before pointcut-ref="beforePointcut" method="beforeAspect" />

</aop:aspect>

</aop:config>

/*

execution(*com.itjob.spring.aop..*Manager.(..))表示切入点为com.itjob.spring.aop

包及其子包中以Manager结尾的类的任意方法钱作为切入点

*/

/*

2、After returning advice(返回后通知):通常在已匹配的方法返回的时候执行,

也可使用@AfterReturning注释来声明。配置如下

*/

<bean id="afterReturningAdviceExample" class="完整类名" />

<aop:config proxy-target-class="false">

<!-- 定义切入点 -->

<aop:pointcut type="aspectj" id="afterReturningPointcut"

exception="execution(*com.itjob.spring.aop..*Manager.*(..))"/>

<!-- 定义切面 -->

<aop:aspect ref="afterReturningAdviceExample">

<aop:after-returning pointcut-ref="afterReturningPointcut"

method="afterReturningAspect" returning="returnValue"/>

</aop:aspect>

</aop:config>

/*

3、After throwing advice(抛出后通知):在一个方法抛出异常后执行。采用声明

方式定义切入点时,可使用@AfterThrowing注释来声明,配置入下

*/

<bean id="afterThrowingAdviceExample" class="完整类名" />

<aop:config proxy-target-class="false">

<!-- 定义切入点 -->

<aop:pointcut type="aspectj" id="afterThrowingPointcut"

exception="execution(*com.itjob.spring.aop..*Manager.*(..))"/>

<!-- 定义切面 -->

<aop:aspect ref="afterThrowingAdviceExample">

<aop:after-throwing pointcut-ref="afterThrowingPointcut"

method="afterThrowingAspect" throwing="ex"/>

</aop:aspect>

</aop:config>

/*

4、After (finally)advice(后通知):不论一个方法是如何结束的,在它结束后

通知都会运行。若使用声明式,可使用@After注释来声明。这个通知必须处理

正常返回和异常返回两种情况,通常来释放资源,配置如下:

*/

<bean id="afterAdviceExample" class="完整类名" />

<aop:config proxy-target-class="false">

<!-- 定义切入点 -->

<aop:pointcut type="aspectj" id="afterPointcut"

exception="execution(*com.itjob.spring.aop..*Manager.*(..))"/>

<!-- 定义切面 -->

<aop:aspect ref="afterAdviceExample">

<aop:after pointcut-ref="afterPointcut"

method="afterAspect" throwing="ex"/>

</aop:aspect>

</aop:config>

/*

5、Around Advice(环绕通知):在一个方法执行之前和之后执行,并且它可以决定

这个方法在什么时候执行、如何执行、甚至是是否执行。声明式的环绕通知可用

@Around注释来声明。

*/

<bean id="aroundAdviceExample" class="完整类名" />

<aop:config proxy-target-class="false">

<!-- 定义切入点 -->

<aop:pointcut type="aspectj" id="aroundPointcut"

exception="execution(*com.itjob.spring.aop..*Manager.*(..))"/>

<!-- 定义切面 -->

<aop:aspect ref="aroundAdviceExample">

<aop:after pointcut-ref="aroundPointcut"

method="aroundAspect" />

</aop:aspect>

</aop:config>

4.AOP适用场景

1)系统权限管理;2)错误处理和异常拦截;3)事务管理;4)持久化;5)同步问题;6)系统调试;7)性能优化;8)日志

Spring中AOP的理解的更多相关文章

  1. 关于Spring中AOP的理解

    AOP简介[理解][重点] 1.AOP(Aspect Oriented Programing)面向切面/方面编程 2.AOP隶属软件工程的范畴,指导开发人员如何制作开发软件,进行结构设计 3.AOP联 ...

  2. Spring 中aop切面注解实现

    spring中aop的注解实现方式简单实例   上篇中我们讲到spring的xml实现,这里我们讲讲使用注解如何实现aop呢.前面已经讲过aop的简单理解了,这里就不在赘述了. 注解方式实现aop我们 ...

  3. JAVA高级架构师基础功:Spring中AOP的两种代理方式:动态代理和CGLIB详解

    在spring框架中使用了两种代理方式: 1.JDK自带的动态代理. 2.Spring框架自己提供的CGLIB的方式. 这两种也是Spring框架核心AOP的基础. 在详细讲解上述提到的动态代理和CG ...

  4. 浅析Spring中AOP的实现原理——动态代理

    一.前言   最近在复习Spring的相关内容,刚刚大致研究了一下Spring中,AOP的实现原理.这篇博客就来简单地聊一聊Spring的AOP是如何实现的,并通过一个简单的测试用例来验证一下.废话不 ...

  5. Spring中AOP相关的API及源码解析

    Spring中AOP相关的API及源码解析 本系列文章: 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 配置类为什么要添加@Configuration注解? 谈谈Spring ...

  6. Spring中IOC的理解

    Spring中IOC的理解 1.什么是IOC? (1)控制反转.把对象创建和对象间的调用过程交给Spring进行管理. (2)使用IOC的目的:为了耦合度降低. 2.IOC底层原理? (1)xml解析 ...

  7. Spring中AOP原理,源码学习笔记

    一.AOP(面向切面编程):通过预编译和运行期动态代理的方式在不改变代码的情况下给程序动态的添加一些功能.利用AOP可以对应用程序的各个部分进行隔离,在Spring中AOP主要用来分离业务逻辑和系统级 ...

  8. Spring中AOP简介与切面编程的使用

    Spring中AOP简介与使用 什么是AOP? Aspect Oriented Programming(AOP),多译作 "面向切面编程",也就是说,对一段程序,从侧面插入,进行操 ...

  9. 框架源码系列十:Spring AOP(AOP的核心概念回顾、Spring中AOP的用法、Spring AOP 源码学习)

    一.AOP的核心概念回顾 https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/core.html#a ...

随机推荐

  1. 【数据结构】 最小生成树(二)——kruskal算法

    上一期说完了什么是最小生成树,这一期咱们来介绍求最小生成树的算法:kruskal算法,适用于稀疏图,也就是同样个数的节点,边越少就越快,到了数据结构与算法这个阶段了,做题靠的就是速度快,时间复杂度小. ...

  2. UTF-8 与 BIG-5 转码

    BIG-5 轉 UTF-8 若要將一個文字檔從 BIG-5 編碼轉換為 UTF-8 編碼,可以執行: iconv -f BIG-5 -t UTF-8 big5.txt > utf8.txt 其中 ...

  3. EXISTS运算符

    和IN.ANY.ALL等运算符不同,EXISTS运算符是单目运算符,它不与列匹配,因此它也不要求待匹配的集合是单列的.EXISTS运算符用来检查每一行是否匹配子查询,可以认为EXISTS就是用来测试子 ...

  4. [2018湖南省队集训] 6.28 T3 simulate

    这道模拟题出的我毫无脾气2333 最重要的是先要发现操作顺序不影响最后的答案,也就是每次随便挑一个>=2的数进行操作最后总是可以得到同样的数列. (这个还不太难想qwq) 但是最骚的是接下来的模 ...

  5. 【CCpp程序设计2017】简单进销存

    题目:简单进销存 功能要求: 实现如下的菜单(按数字选择菜单功能): 1. 显示存货列表 2. 入库 3. 出库 4. 退出程序 实现菜单对应功能(需记录货物的型号.数量等信息): 程序启动时从文件中 ...

  6. 【后缀自动机】CDOJ1551 Hesty Str1ng

    可以发现,对于原串的每个长度>1的子串而言,将其除了最后一个字符之外反向接在其结尾,都是一个合法解.该解的长度一定是奇数. 对于原串的每个长度>2,且结尾两个字符相同的子串而言,将其除了最 ...

  7. 【动态规划】mr351-办签证

    [题目大意] xuzhenyi要办个签证.办证处是一座M层的大楼,1<=M<=100. 每层楼都有N个办公室,编号为1..N(1<=N<=500).每个办公室有一个签证员. 签 ...

  8. python基础之反射内置方法元类

    补充内置函数 isinstance(obj,Foo)   # 判断obj是不是foo的实例 issubclass()      # 判断一个类是不是另一个类的子类 反射 什么是反射? 通过字符串来操作 ...

  9. openstack-cinder-netapp

    https://communities.netapp.com/docs/DOC-31749 http://docs.openstack.org/havana/config-reference/cont ...

  10. 【转】记录PHP、MySQL在高并发场景下产生的一次事故

    看了一篇网友日志,感觉工作中值得借鉴,原文如下: 事故描述 在一次项目中,上线了一新功能之后,陆陆续续的有客服向我们反应,有用户的个别道具数量高达42亿,但是当时一直没有到证据表示这是,确实存在,并且 ...