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. es6 Object的几个新方法

    扩展对象 Object.preventExtensions Object.isExtensible 密封对象 Object.seal Object.isSealed 冻结对象 Object.freez ...

  2. ExtJs之列表常用CRUD

    前端代码: Ext.onReady(function(){ Ext.define('Person', { extend: 'Ext.data.Model', fields: [{name: 'id', ...

  3. 一个菜鸟正在用SSH写一个论坛(2)

    额 一不小心又一个多月没有写过随笔了. 这次是在某次启动服务器的时候报错了: 严重: Exception starting filter struts2 Unable to load configur ...

  4. 【快速幂】POJ3641 - Pseudoprime numbers

    输入a和p.如果p不是素数,则若满足ap = a (mod p)输出yes,不满足或者p为素数输出no.最简单的快速幂,啥也不说了. #include<iostream> #include ...

  5. 从源码入手,一文带你读懂Spring AOP面向切面编程

    之前<零基础带你看Spring源码--IOC控制反转>详细讲了Spring容器的初始化和加载的原理,后面<你真的完全了解Java动态代理吗?看这篇就够了>介绍了下JDK的动态代 ...

  6. 83.(01背包)CYD刷题

    3130 CYD刷题  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 下午,CYD要刷题了,已知CY ...

  7. C#中的Stack

    Stack(栈) 是一种先进后出的对象集合,它是一个泛型,所表示的类型可以为int,string这样的常见类型,也可以为用户自定义类型. 属性 描述 Count 获取 Stack 中包含的元素个数. ...

  8. Linux 内核中的 GCC 特性

    https://www.ibm.com/developerworks/cn/linux/l-gcc-hacks/ GCC 和 Linux 是出色的组合.尽管它们是独立的软件,但是 Linux 完全依靠 ...

  9. 判断 Selite中标存在或者字段存在的方法

    判断表存在的方法很简单,网上很多: SELECT COUNT(*) FROM sqlite_master where type='table' and name='%s'" % tname; ...

  10. 基于tiny4412的Linux内核移植 -- eMMC驱动移植(六)

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...