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. python url配置单独放在某个应用目录中

    文件目录: 将 urls.py 文件复制blog目录下: 此时,blog文件夹下多了urls.py文件 现在对比,两个urls.py文件: 分离前:(只有website里有urls.py) from ...

  2. 异步加载 Echarts图的数据

    <script src="~/Scripts/NewEcharts/echarts.js"></script> <script type=" ...

  3. Java HashSet的元素内容变化导致的问题

    概述 HashSet元素引用的对象的内容发生变化,会导致"元素不属于集合"的问题.事实上这个元素还在集合里,但是调用contains方法进行判断,得到的结果却是false. 正文 ...

  4. CKEditor的API查看

    概述 在写上一篇随笔的过程中翻看了CKEditor的API,现在把相关的经验记录下来. CKEditor的相关文档地址:http://docs.ckeditor.com/#,API在第二个标签页:第一 ...

  5. Redux 洋葱模型理解

    下面的代码会输出: A middleware1 开始C middleware2 开始E middleware3 开始======= G =======F middleware3 结束D middlew ...

  6. PM过程的一些典型场景和问题

    如何进行团队激励 如何进行目标管理 如何进行绩效考核 如何处理团队沟通(技巧) 详述几种软件过程理论 需求分析和度量 测试过程和工具 开发管理过程

  7. 【数论】【原根】【动态规划】【bitset】2017四川省赛 K.2017 Revenge

    题意: 给你n(不超过200w)个数,和一个数r,问你有多少种方案,使得你取出某个子集,能够让它们的乘积 mod 2017等于r. 2017有5这个原根,可以使用离散对数(指标)的思想把乘法转化成加法 ...

  8. 【动态规划】【二分】Petrozavodsk Winter Training Camp 2017 Day 1: Jagiellonian U Contest, Monday, January 30, 2017 Problem B. Dissertation

    题意: 给定S1串,长度100w,S2串,长度1k.问它俩的LCS. f(i,j)表示S2串前i个字符,LCS为j时,最少需要的S1串的前缀长度.转移的时候,枚举下一个字符在S1的位置即可.(可以预处 ...

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

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

  10. 使用XML向SQL Server 2005批量写入数据——一次有关XML时间格式的折腾经历

    使用XML向SQL Server 2005批量写入数据——一次有关XML时间格式的折腾经历   原文:使用XML向SQL Server 2005批量写入数据——一次有关XML时间格式的折腾经历 常常遇 ...