Spring AOP属于第二代AOP。采用Java作为AOP的实现语言(AOL),采用动态代理机制和字节码生成技术实现。

代理设计模式

  • ISubject 对被访问者或者被访问资源的抽象,某些场景下不使用类似的统一抽象接口也可以
  • SubjectImpl 具体实现类
  • SubjectProxy 代理实现类
  • Client 代表访问者的抽象角色

代理不只局限于请求的转发,更多时候是对请求添加更多访问限制或简化使用
Spring AOP本质上就是采用这种代理机制实现的

Java 平台上的AOP实现机制

  • 动态代理
    通过JDK 1.3引入的动态代理机制,为相应的接口动态生成对应的代理对象,SPring AOP默认情况下采用这种机制。但动态代理只能对实现了相应Interface的类使用。
  • 动态字节码增强
    使用ASM或者CGLIB等Java工具库,在程序运行期间,动态构建字节码的class文件,只要满足Java虚拟机加载的class规范就行。无需接口,唯一限制就是无法对final 方法进行覆写。
  • Java代码生成
    比较古老,已退休
  • 自定义类加载器
    所有的Java程序的clas都要通过相应的类加载器加载到Java虚拟机之后才能运行。功能比之前几种方式强大,但加重类加载器本身的负担
  • AOL扩展
    最强大,最难掌握。

Spring AOP

AOP基本概念实现

  • Joinpoint
    仅支持方法级别的Joinpoint(Metho Execution),可以满足80%的开发需求了。
  • Pointcut

  • Advice

  • Aspect
    Advisor代表Spring中的Aspect,但是,与正常的Aspect不两只,Advisor通常只持有一个Pointcut和一个Advice。而理论上,Aspect定义可以有多个Pointcut和Advice

织入 ProxyFactory

俗话说得好,“万事俱务,只欠东风”,各个模块已经实现了,最后一步就是拼装了。
要进行织入,AspectJ采用ajc编译器;JBoss AOP使用自定义的ClassLoader,而Spring AOP使用类org.springframework.aop.framework.ProxyFactory作为织入器。

几种Spring AOP

  • Spring AOP 1.x 基于接口定义的的Advice声明方式:各种类型的Adivce定义需要实现特定的接口,Advice的管理可以通过IoC容器或者直接编程进行。
  • @AspectJ 2.0之后新增加,只需要以POJO形式声明相应的Aspect和Advice,然后通过相应的注解标注一下即可。各种信息的管理统一到一个位置,并且由于IDE的重构支持,AOP的管理更加方便高效。
  • 基于Schema的AOP。融合第一代和第二代。各种信息转移到XSD形式的容器配置文件中。
    应该依照当前应用环境、各种工具支持、整体团队能力等不同情况来权衡利弊。

Spring 初探(二) AOP 图集的更多相关文章

  1. spring学习(二) ———— AOP之AspectJ框架的使用

    前面讲解了spring的特性之一,IOC(控制反转),因为有了IOC,所以我们都不需要自己new对象了,想要什么,spring就给什么.而今天要学习spring的第二个重点,AOP.一篇讲解不完,所以 ...

  2. 学习 Spring (十二) AOP 基本概念及特点

    Spring入门篇 学习笔记 AOP: Aspect Oriented Programming, 通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术 主要功能是:日志记录.性能统计.安全控 ...

  3. Spring 学习二-----AOP的原理与简单实践

    一.Spring  AOP的原理 AOP全名Aspect-Oriented Programming,中文直译为面向切面(方面)编程.何为切面,就比如说我们系统中的权限管理,日志,事务等我们都可以将其看 ...

  4. 框架应用:Spring framework (二) - AOP技术

    基础概念 线程中的方法栈 java程序虚拟机启动时会载入程序码,虚拟机会为每一条正在运行的线程生成一个方法调用栈,线程以方法运行为执行单位. AOP概念以及目标 AOP是面向切面编程,其实就是在不修改 ...

  5. Spring 初探(一) IoC 图集

    Spring 框架总体结构 IoC 直观 Spring IoC容器 Spring提供两种容器类型: - BeanFactory - ApplicationContext ApplicationCont ...

  6. spring(二) AOP之AspectJ框架的使用

    前面讲解了spring的特性之一,IOC(控制反转),因为有了IOC,所以我们都不需要自己new对象了,想要什么,spring就给什么.而今天要学习spring的第二个重点,AOP.一篇讲解不完,所以 ...

  7. spring注解、aop(二)

    使用注解配置spring 1.导入 spring-aop-5.0.6.RELEASE.jar包 2.为主配置文件引入新的命名空间 xmlns:context="http://www.spri ...

  8. Spring系列之AOP实现的两种方式

    AOP常用的实现方式有两种,一种是采用声明的方式来实现(基于XML),一种是采用注解的方式来实现(基于AspectJ). 首先复习下AOP中一些比较重要的概念: Joinpoint(连接点):程序执行 ...

  9. Spring核心框架 - AOP的原理及源码解析

    一.AOP的体系结构 如下图所示:(引自AOP联盟) 层次3语言和开发环境:基础是指待增加对象或者目标对象:切面通常包括对于基础的增加应用:配置是指AOP体系中提供的配置环境或者编织配置,通过该配置A ...

随机推荐

  1. linux yum 使用epel源

    由于CentOS6的系统安装了epel-release-latest-7.noarch.rpm 导致在使用yum命令时出现Error: xz compression not available问题. ...

  2. Number of Containers ZOJ - 3175(数论题)

    Problem Description For two integers m and k, k is said to be a container of m if k is divisible by  ...

  3. python *****【异常处理】*****

    try: val = input('请输入数字:') num = int(val) except Exception as e: print('操作异常') # import requests # # ...

  4. X86逆向13:向程序中插入Dll

    本章我们将学习Dll的注入技巧,我们将把一个动态链接库永久的插入到目标程序中,让程序在运行后直接执行这个Dll文件,这一章的内容也可以看作是第八课的加强篇,第八课中我们向程序中插入了一个弹窗,有木有发 ...

  5. C# 常用类库说明

    Array类 用括号声明数组是C#中使用Array类的记号.在后台使用C#语法,会创建一个派生于抽象基类Array的新类.这样,就可以使用Array类为每个C#数组定义的方法和属性了. Array类实 ...

  6. Length of LOB data (190999) to be replicated exceeds configured maximum 65536. 错误修改

    在上传附件时,本地是可以的但服务器上就有了文件大小的限制,不能上传.经过打断点找到这样一个错误: Length of LOB data (190999) to be replicated exceed ...

  7. ES6新特性总结

    一.let const var有缺陷:有块级作用域.能重复定义.无法限制修改.所以出来了let和const. 有块级作用域,不能重复定义 const不能修改,必须定义的时候赋值 二.解构赋值 1.左右 ...

  8. JS基础_条件分支语句:switch语句

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. 微信小程序返回箭头跳转到指定页面

    onUnload: function () { wx.reLaunch({ url: '../me/order-detail', }) },//这里url搞相对路径 wx.reLaunch跳到新页面没 ...

  10. IntelliJ IDEA(Community版本)本地模式的下载、安装及其使用

    对于初学者来说可以先使用免费的社区版本练练手. ideaIC-2017.3.5——>社区版 ideaIU-2017.3.5——>旗舰版 一.IntelliJ IDEA(Community版 ...