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. Pythonic和语法糖

    Pythonic就是以Python的方式写出简洁优美的代码. 用Python独有的语法写Python语言. 知乎:https://www.zhihu.com/question/20244565 某博客 ...

  2. Arduino可穿戴开发入门教程Windows平台下安装Arduino IDE

    Arduino可穿戴开发入门教程Windows平台下安装Arduino IDE Windows平台下安装Arduino IDE Windows操作系统下可以使用安装向导和压缩包形式安装.下面详细讲解这 ...

  3. luogu P1016 旅行家的预算

    题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿 ...

  4. 【BFS】Pots

    [poj3414]Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16925   Accepted: 7168   ...

  5. 【动态规划+二分查找】POJ2533&POJ1631最长上升子序列(LIS)

    POJ2533裸的LIS,时间复杂度为O(n^2) #include<iostream> #include<cstdio> using namespace std; +; in ...

  6. [NOI2017]整数

    [NOI2017]整数 题目大意: \(n(n\le10^6)\)次操作维护一个长度为\(30n\)的二进制整数\(x\),支持以下两种操作: 将这个整数加上\(a\cdot2^b(|a|\le10^ ...

  7. bootstrapTable定位行固定滚动条

    写在前面: 当页面table列表数据有修改后,用户需要再次回到修改的行位置. 1.当修改行数据后,table刷新,行数据位置前后不发生改变 ,可使用下面这种方法: /*获取当前滚动条的位置*/ var ...

  8. 内网中让其他人访问我电脑上的asp.net应用程序

    打开防火墙,高级配置,新建入站规则,选择“端口”,下一步,填写特定本地端口,然后都是点击下一步,命名规则,到此,内网中的其他人可以访问你的程序了

  9. django, form.errors处理

    from.errors其实就是一个字典, 可以利用for error in form.errors.values, 或者for key,  value in form.errors遍历得到其中的数据

  10. ThinkPad X240 禁掉触摸板

    控制面板 --> 鼠标 --> Thinkpad