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. luogu P1396 营救

    题目描述 “咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!小明感动的热泪盈眶,开起了门…… 妈妈下班回家,街坊邻居说小明被一群陌生人强行押上了警车!妈妈丰富的经验告诉她小 ...

  2. [BZOJ1913][APIO2010]信号覆盖(计算几何+计数)

    1913: [Apio2010]signaling 信号覆盖 Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 1658  Solved: 672[Subm ...

  3. poj 1127(直线相交+并查集)

    Jack Straws Description In the game of Jack Straws, a number of plastic or wooden "straws" ...

  4. 【图论】Popular Cows

    [POJ2186]Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 34752   Accepted: ...

  5. 【拓扑排序】Genealogical tree

    [POJ2367]Genealogical tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5696   Accep ...

  6. Android中Acition和Category常量表

    Action Action常量 对应字符串 简单说明 ACTION_MAIN android.intent.action.MAIN 应用程序入口 ACTION_VIEW android.intent. ...

  7. Spring的Bean生命周期理解

    首先,在经历过很多次的面试之后,一直不能很好的叙述关于springbean的生命周期这个概念.今日对于springBean的生命周期进行一个总结. 一.springBean的生命周期: 如下图所示: ...

  8. 【bugku】【RE】file WriteUp

    FILE 查壳后显示无壳,拖进IDA: 运行程序时传递的第一个参数为一个文件名,并打开该文件.下面点进去encode函数分析一下: for循环中每三个为一组,进行Base64的操作,接下来两个if分别 ...

  9. [转]SpringMVC拦截器详解[附带源码分析]

      目录 前言 重要接口及类介绍 源码分析 拦截器的配置 编写自定义的拦截器 总结 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:ht ...

  10. GitHub 给已存在的仓库增加开原协议LICENSE

    如果你创建仓库时没有设置开原协议LICENSE,后续可以按下面方法增加开原协议LICENSE. 1.点击Create new file,如下图 2.文件名填LICENSE.md,右边就会出现choos ...