Spring入门篇 学习笔记

AOP: Aspect Oriented Programming, 通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术

主要功能是:日志记录、性能统计、安全控制、事务处理、异常处理等

AOP 实现方式

  1. 预编译:AspectJ
  2. 运行期动态代理(JDK 动态代理, CGLib 动态代理):SpringAOP, JbossAOP

AOP 相关概念

  • 切面 (Aspect):一个关注点的模块化,这个关注点可能会横切多个对象
  • 连接点 (Joinpoint):程序执行过程中某个特定的点
  • 通知 (Advice):在切面的某个特定的连接点上执行的动作
  • 切入点 (Pointcut):匹配连接点的断言,在 AOP 中通知和一个切入点表达式关联
  • 引入 (Introduction):在不修改类代码的前提下,为类添加新的方法和属性
  • 目标对象 (Target Object):被一个或者多个切面所通知的对象
  • AOP 代理 (AOP Proxy):AOP 框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)
  • 织入 (Weaving):把切面连接到其它的应用程序类型或者对象上,并创建一个被通知的对象,分为:编译时织入、类加载时织入、执行时织入

Advice 的类型

  1. 前置通知 (Before advice):在某连接点之前执行的通知,但不能阻止连接点前的执行(除非它抛出一个异常)
  2. 返回后通知 (After returning advice):在某连接点正常完成后执行的通知
  3. 抛出异常通知 (After throwing advice):在方法抛出异常退出时执行的通知
  4. 后通知 (After (finally) advice):当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)
  5. 环绕通知 (Around advice):包围一个连接点的通知

Spring 框架中 AOP 的用途

  • 提供了声明式的企业服务,特别是 EJB 的替代服务的声明
  • 允许用户定制自己的切面,以完成 OOP 与 AOP 的互补使用

Spring 的 AOP 实现方式:

  • 纯 java 实现,无需特殊大的编译过程,不需要控制类加载器层次
  • 目前只支持方法执行连接点(通知 Spring Bean 的方法执行)
  • 不是为了提供最完整的 AOP 实现,而是侧重于提供一种 AOP 实现和 Spring IoC 容器之间的整合,用于帮助解决企业应用中的常见问题
  • Spring AOP 不会与 AspectJ 竞争,不会提供综合全面的 AOP 解决方案

有接口和无接口的 Spring AOP 实现区别

  • Spring AOP 默认使用标准的 Jave SE 动态代理作为 AOP 代理,这使得任何接口(或者接口集)都可以被代理
  • Spring AOP 中也可以使用 CGLIB 代理(如果一个业务对象并没有实现一个接口)

源码:learning-spring

学习 Spring (十二) AOP 基本概念及特点的更多相关文章

  1. Spring学习记录(十二)---AOP理解和基于注解配置

    Spring核心之二:AOP(Aspect Oriented Programming) --- 面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软 ...

  2. 学习 Spring (十六) AOP API

    Spring入门篇 学习笔记 Spring AOP API 是 Spring 1.2 历史用法,现在仍然支持 这是 Spring AOP 基础,现在的用法也是基于历史的,只是更简便了 Pointcut ...

  3. 学习MQ(二)基本概念

    学习MQ(二)基本概念 这次简单罗列一下MQ的基本概念,还有我对它们的理解 1.queue manager 队列管理器,这是MQ系统中最上层的一个概念.每一个queue manager都有一个侦听器, ...

  4. python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL

    python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...

  5. (C/C++学习笔记) 十二. 指针

    十二. 指针 ● 基本概念 位系统下为4字节(8位十六进制数),在64位系统下为8字节(16位十六进制数) 进制表示的, 内存地址不占用内存空间 指针本身是一种数据类型, 它可以指向int, char ...

  6. Go语言学习笔记十二: 范围(Range)

    Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...

  7. Tensorflow深度学习之十二:基础图像处理之二

    Tensorflow深度学习之十二:基础图像处理之二 from:https://blog.csdn.net/davincil/article/details/76598474   首先放出原始图像: ...

  8. Spring学习(18)--- AOP基本概念及特点

    AOP:Aspect Oriented Programing的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序程序功能的统一维护的一种技术 主要的功能是:日志记录,性能统计,安全控制, ...

  9. java jvm学习笔记十二(访问控制器的栈校验机制)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 本节源码:http://download.csdn.net/detail/yfqnihao/4863854 这一节,我们 ...

随机推荐

  1. OmniPlan 3 Pro密钥

    密钥用户名都是youliyuan.OmniPlan 3:HOMJ-QOJH-OIBN-TNIH-HWUN-TEEH-WUNNKWO-HVKB-JAZE-UIHH-XAVY-BEEX-AVYBCRW-M ...

  2. P3372 【模板】线段树 1

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个 ...

  3. Java hashCode() equals()总结

    1.hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的: 2.如果两个对象相同,就是适用于equals(j ...

  4. face detection[PyramidBox]

    本文来自<PyramidBox: A Context-assisted Single Shot Face Detector>,是来自百度的作品,时间线为2018年8月. 0 引言 最近基于 ...

  5. 【PHP快速入门】 第二节 php基本语法

    1.什么地方能写PHP代码? php代码需要写在php标识符内,就是这个东西: 在我们编写一个php程序时,必须要在这个文件里面写上 2.PHP语句要不要加分号? 有的地方要加,有的地方不要加.(似乎 ...

  6. Windows系统,文件和文件夹命名规则:

    不能包含:< > / \ | : * ? windows中,文件名(包括扩展名)可高达 个字符.文件名可以包含除 ? “ ”/ \ < > * | : 之外的大多数字符:保留文 ...

  7. react中如何使用动画效果

    在react中想要加入动画效果 需要引入 import {CSSTransitionGroup} from 'react-transition-group' //加入react 动画包 import ...

  8. C# 父子页面传值

    业务需求是:父页面点击“选择任务”按钮进入任务列表页.(项目进度周报) 父页面如下: 任务列表页: 选择某一个任务,点击“确定”后返回父页面所需数据. 父页面“选择任务” 按钮触发事件. /// &l ...

  9. Oracle 不小心删除undo数据文件以及磁盘空间不足导致不能登录的解决办法

    在一次测试中,由于导入的数据量过大导致事务一直提交失败因为磁盘空间不够用了,一检查发现是undo表空间不够用,于是重新创建了一个表空间,准备把之前的undo表空间删除,删除时却发现一直删不掉,因为它一 ...

  10. [日志]SAP S/4 HANA 启动与关闭的顺序

    注意 如果是非正式版的话 修改了日期了  需要重启一下应用和数据库才可以, S/4 HANA 启动步骤 先启动HANA: 在终端里输入 su - hdbadm HDB start 再启动S4 su - ...