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. upper_bound

    头文件: #include<algorithm> 作用: 查找第一个大于给定数的元素或位置 在从小到大的排序数组中, 1.容器 (1).返回元素 #include<cstdio> ...

  2. python日志等级输出删选

    有时候我们会删选一下输出的信息 当做日志进行文件保存 但是我们程序中有可能有自己不想存到日志文件中的输出信息 我们要做一些的删选  然后进行保存 代码如下: #!/usr/bin/python # - ...

  3. linux内存源码分析 - 内存压缩(同步关系)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 概述 最近在看内存回收,内存回收在进行同步的一些情况非常复杂,然后就想,不会内存压缩的页面迁移过程中的同步关系也 ...

  4. Vscode更新之后rg.exe占用cpu过高

    文件->首选项->搜索"search.followSymlinks"改为false https://www.zhihu.com/question/67317040

  5. Java获取Window和Linux系统的项目ClassPath路径

    不啰嗦,直接复制工具类 /** * 在windows和linux系统下均可正常使用 * Create by yster@foxmail.com 2018/6/6/006 14:51 */ public ...

  6. .NET-记一次架构优化实战与方案-目录

    前言 本系列是根据我公司的某块业务优化进行改写的,为了避免触发法律的红线,我对部分代码做了截取并打码. 因为优化方案是针对现有业务的问题情况进行的,不做任何太过过分吹牛逼.一切以基于现有的业务,优化处 ...

  7. Jenkins-job之间依赖关系配置

    使用场景: 想要在某APP打新包之后,立即执行自动化测试的job来验证该新包. 比如Job A 执行完执行Job B ,如下图所示,如何建立依赖呢? 1.配置上游依赖 构建触发器-配置如下信息: 选择 ...

  8. Individual Project

    这次我自己完成了一个小小的项目,课可以把这篇随笔当做一次实验报告,主要的内容是用JUnit进行单元测试.由于我的技术太弱了,就在博客园里“求师”,按照大神的方法慢慢把这些东西写了下啦来. 不知道怎么搞 ...

  9. 软件工程(FZU2015) 赛季得分榜,第三回合

    SE_FZU目录:1 2 3 4 5 6 7 8 9 10 11 12 13 积分规则 积分制: 作业为10分制,练习为3分制:alpha30分: 团队项目分=团队得分+个人贡献分 个人贡献分: 个人 ...

  10. 社交CRM SCRM

    社交CRM - 国际版 Binghttps://cn.bing.com/search?FORM=U227DF&PC=U227&q=%E7%A4%BE%E4%BA%A4CRM 社交CRM ...