AOP什么?


AOP在功能方面,它是之前和之后运行一些业务逻辑,一些操作(比方记录日志、或者是推断是否有权限等),这些操作的加入。全然不耦合于原来的业务逻辑。从而对原有业务逻辑全然是透明。

也就是说。这段操作和业务逻辑是全然分开的,它可能在项目中须要横切多个模块。且其自身也是一个独立的模块,贯穿了整个项目。我们全然能够依据须要启用或者停用这个功能。 AOP的典型应用就是事务管理和日志。

AOP中的概念


以下这些术语并非Spring定义的。因为AOP中的术语不是那么形象,所以假设Spring再自定义一套的话那么会使得这些概念更加混淆。

a) 切面(Aspect):一个横切关注点的模块化。在企业级JAVA应用中,事务管理是一个关于横切关注点的典型样例。在Spring AOP中,切面能够用常规类(基于shcema)或者用常规类并加上注解来实现(基于@AspectJ)。

b) 通知(Advice):由切面在特定的连接点运行的动作称为通知。不同类型的通知包含,前置通知、围绕通知、后置通知等。

很多AOP框架,包含Spring,把通知模拟成一个拦截器。围绕着连接点维护一个拦截器链。

c) 连接点(JoinPoint):程序运行过程中的一个点,比方说运行方法或者是处理异常。在Spring Aop中。一个连接点总是代表一个方法的运行。

d) 目标对象(Target Object):也就是须要被通知的对象。所以也叫被通知对象(advised object)。因为Spring AOP是用执行时代理来实现的,所以这个对象总是个被代理的对象。

e) AOP代理(AOP proxy):AOP框架创建用来实现实现AOP功能的。在Spring框架中,AOP代理能够基于JDK动态代理,也能够是基于CGLIB的代理。

f) 织入(Weaving):把切面和其他应用类型或者对象来创建一个目标对象。

能够在编译期(比方使用 AspectJ编译器),装载阶段或者是执行时完毕。正如别的纯Java的AOP框架一样,Spring AOP在执行时实现织入。

通知类型


a) 前置通知(Before advice):在连接点之前运行,可是无法阻止连接点的运行(除非当中抛出异常)

b) 后置返回通知(After returning advice):在连接点正常运行完毕后运行,比方一个方法正常返回且没有抛出异常

c) 后置异常通知(After throwing advice):在被通知方法抛出异常后运行

d) 后置通知(After (final) advice):仅仅要连接点运行那就一定会运行,无论是抛出异常还是正常返回

e) 围绕通知(Around advice):这是最强大的通知,它能够实现前置通知和后置通知,而且它还能够来控制①是否运行连接点②返回值③抛异常

围绕通知是最常见的一种通知。Spring AOP像AspectJ一样提供了全范围的通知类型,所以官方文档给出的建议是使用“最弱小”的通知来实现我们的需求,为什么呢?你懂的,杀鸡焉用牛刀。且复杂的东西easy出错。比方,假设你仅仅须要用法的返回值更新一下缓存,尽管围绕通知也能够满足这一要求,但使用一个后置返回通知将要比使用一个围绕通知要好。使用最合适的通知类型会让你的编程模型变的简单,从而避免一些潜在的错误。

比方,你不须要去调用ProceedingJoinPoint的proceed()方法,因此你不会由于调用它而出错。

连接点的概念和切入点一样,都是AOP的核心。

它们让AOP差别于更老的一些仅仅提供拦截器的技术。

切入点能把通知指向到目标,而不必局限于OOP的结构。比方,围绕通知能够对那些横跨多个对象的方法(比方服务层的全部业务方法)提供事务管理。

须要注意的地方


1、若存在around,且around未proceed目标方法。那么after则不会被触发

2、若存在around,且proceed目标方法抛出异常。那么proceed之后的语句就不会运行到,而是直接到after or after returing

3、若存在around,且around正常运行。那么around方法的返回值。也就是在after-returning中可以获得的返回值

4、若不存在around,那么after-returning可以获得的返回值就是目标方法运行后的返回值

5、around就算不给返回值,也不会妨碍目标方法的调用,并不像网上说的那样会导致目标方法停止调用并返回null

6、事务是与线程绑定的,如果在该方法中打开一个新的线程,所以很自然独立于先前的交易

版权声明:本文博客原创文章,博客,未经同意,不得转载。

Spring AOP入门——概念和注意事项的更多相关文章

  1. Spring入门篇——第5章 Spring AOP基本概念

    第5章 Spring AOP基本概念 本章介绍Spring中AOP的基本概念和应用. 5-1 AOP基本概念及特点 5-2 配置切面aspect ref:引用另外一个Bean 5-3 配置切入点Poi ...

  2. Spring AOP基本概念

    Spring AOP基本概念 目录 Spring AOP定义 AOP基本术语 通知类型 AOP定义 AOP基本术语 切面( Aspect ):一个能横切多个对象的模块化的关注点.对Spring AOP ...

  3. Spring Aop重要概念介绍及应用实例结合分析

    转自:http://bbs.csdn.net/topics/390811099 此前对于AOP的使用仅限于声明式事务,除此之外在实际开发中也没有遇到过与之相关的问题.最近项目中遇到了以下几点需求,仔细 ...

  4. Spring AOP 入门实例详解

    目录 AOP概念 AOP核心概念 Spring对AOP的支持 基于Spring的AOP简单实现 基于Spring的AOP使用其他细节 AOP概念 AOP(Aspect Oriented Program ...

  5. Spring AOP基础概念及自定义注解式AOP初体验

    对AOP的理解开始是抽象的,看到切点的匹配方式其实与正则表达式性质大致一样就基本了解AOP是基本是个什么作用了.只是整个概念更抽象,需要具化理解.下图列表是AOP相关概念解释,可能也比较抽象^_^ 比 ...

  6. Spring学习总结(1)——Spring AOP的概念理解

    1.我所知道的aop 初看aop,上来就是一大堆术语,而且还有个拉风的名字,面向切面编程,都说是OOP的一种有益补充等等.一下子让你不知所措,心想着:怪不得 很多人都和我说aop多难多难 .当我看进去 ...

  7. 基于注解的Spring AOP入门、增强Advice实例

    这篇文章简单通过一个例子,介绍几种增强的基本配置,以方便spring框架初学者对aop的代码结构有个清楚的了解认识.首先,spring支持aop编程,支持aspectJ的语法格式来表示切入点,切面,增 ...

  8. Spring Boot 入门概念介绍

    使用spring-boot快速开发spring应用 转 http://itindex.net/detail/49108-spring-boot-%E5%BC%80%E5%8F%91 spring多年以 ...

  9. spring AOP的概念和使用

    指路:http://www.cnblogs.com/liujiayun/p/5912628.html AOP的来源:OOP在一些重复代码的使用中,代码冗余比较多,利用AOP可以改善. 通过编写切面和切 ...

随机推荐

  1. Codeforces Round#297 div2

    B: 题意:给定一个字符串,然后给定m个数字 对于每个数字ai的含义是,将ai到n-ai+1的字符串给翻转一遍. 要求输出m次翻转之后的字符串. 想法就是判断第i个位置的字符是翻转了奇数次,还是偶数次 ...

  2. WPF Media 简单的播放器

    <Window x:Class="PlayTest.MediaControl" xmlns="http://schemas.microsoft.com/winfx/ ...

  3. 通过angularjs的directive以及service来实现的列表页加载排序分页(转)

    前两篇:(列表页的动态条件搜索,我是如何做列表页的)分别介绍了我们是如何做后端业务系统数据展示类的列表页以及动态搜索的,那么还剩下最重要的一项:数据展示.数据展示一般包含三部分: 数据列头 数据行 分 ...

  4. Sql Server函数全解<四>日期和时间函数

    原文:Sql Server函数全解<四>日期和时间函数   日期和时间函数主要用来处理日期和时间值,本篇主要介绍各种日期和时间函数的功能和用法,一般的日期函数除了使用date类型的参数外, ...

  5. 远程连接到vultr vps的mysql服务器

    实验环境 vultr centos 6.7 x64 1. 首先要打开远程 vps的3306端口用于 mysql的连接 修改/etc/sysconfig/iptables 文件,添加3306端口的支持 ...

  6. 如何设置多个同一页的tinymce编辑

    的页面设置多个tinymce编辑器 This example shows how to setup multiple editors on the same page and with differe ...

  7. Timus 1777. Anindilyakwa 奇怪的问题计数

    The language of Australian aborigines anindilyakwa has no numerals. No anindilyakwa can say: "I ...

  8. Xamarin.Android 在VS下调试时提示 In mgmain JNI_OnLoad 程序“Mono”已退出 解决办法

    原因是使用了破解版的 Xamarin,调试时不能使用共享库

  9. 认识Backbone (四)

    Backbone.View(视图) 视图的核心是处理数据业务逻辑.绑定DOM元素事件.渲染模型或者集合数据. 添加DOM元素  render view.render() render 默认实现是没有操 ...

  10. node.js基础:模块的创建和引入

    模块可能是一个文件,也可能是包含一个或多个文件的目录.如果模块是个目录,node.js通常会在这个目录下找一个叫index.js的文件作为模块的入口. 典型的模块是一个包含exports对象属性定义的 ...