关闭

【Spring源码--AOP的实现】--综述

标签: SpringAOP对象技术设计
551人阅读 评论(3) 收藏 举报
分类:

前言:

相比于IOC的源码,AOP的源码更为抽象一点。因为我们在读IOC源码,可以根据我们的Bean配置,去相结合着思考和理解,而AOP的是一个切面的概念,所生成的代理对象也不是我们说看到就看到的,相对抽象一点,但是AOP的源码相对于IOC的源码少了很多。所以我们在读AOP源码的时候,应该先把整个流程快速的读通,再去一点点具体到方法,再者就是自己动手写demo。那么,本文作为AOP的综述,主要写一些基本概念及AOP的整体设计流程。

AOP的基本概念

  1. Advice:通知,定义在指定连接点上做什么内容。是AOP联盟定义的一个接口,SpringAOP在实现中提供了更多的具体通知类型,如BeforeAdvice、AfterAdvice、ThrowsAdvice等。
  2. Pointcut:切点,符合切点表达式的连接点,也就是被真正切入的地方。
  3. Aspect:切面,切入系统的一个切面,比如事物管理是一个切面,权限管理是一个切面。
  4. Join point:连接点,进行横向切入的位置。

AOP的理解:

Spring AOP是基于JDK动态代理和CGLIB(动态字节码增强技术)实现的,在方法执行的前后进行拦截。
对于AOP的理解,可以引用网友的一段话:
aop切面编程就是在常规的执行java类中方法前或执行后加入自定义的方法。比如你本来每天都去打酱油,去,打酱油,回。现在我每天在你打酱油路上等着,你去打酱油的时候我打你一顿,回来的时候给你点糖果吃。你根本不知道为什么我会在路上拦住打你。所以在切面中插入你自定义的方法,这个方法的执行和本身要执行的类方法无关系,也就是不是这个类的方法来调用你写的方法的,你写的方法什么时候执行都是要通过在配置指定。我打完你,你该打酱油还是去打酱油,当然我如果是拦住你让你酱油打少点,你打酱油的时候还是会打那么多,但是在你打完酱油回来的时候我可以把你的酱油倒些出去,所以嵌入的自定义方法对要调用的类方法本身没有影响,但是可以操纵这个方法的返结果或者处理结果。

AOP的设计分析:

虽然对于我们使用者来说,只需要进行简单的配置即可使用SpringAOP,但仔细分析其内部实现可以看到,这里面还是有挺复杂的一个过程。如图所示:
上面这个图大概解释了aop的一个实现过程,具体的细节还是有很多的,这里只是给大家理解一个整体流程。具体我们后面会分析代码,也就是按照这个顺序。

AOP的配置方式:

一般可以有以下几种方式,其中<aop:config>用的最多,AspectJ的注解用的也还好,ProxyFactoryBean就相对麻烦点,不过是最基本的,最好理解AOP原理的,根据项目不同进行选择。
  • 配置ProxyFactoryBean,显式地设置advisors, advice, target等
  • 通过<aop:config>来配置
  • 通过<aop:aspectj-autoproxy>来配置,使用AspectJ的注解来标识通知及切入点

AOP的应用场景:

应用场景体现在两个方面:一是应用可以直接使用AOP的功能,设计应用的横切关注点,把扩约应用程序多个模块的功能抽象出来,并通过简单的AOP的使用,灵活的编制到模块中,比如:日志记录的功能。另一方面,在Spring内部,一些支持模块也是利用Spring AOP来实现的,如:事务处理。根据网上的网友总结,大概可以用用到一下几个方面:
  • Authentication 权限
  • Caching 缓存
  • Context passing 内容传递
  • Error handling 错误处理
  • Lazy loading 懒加载
  • Debugging  调试
  • logging, tracing, profiling and monitoring 记录跟踪 优化 校准
  • Performance optimization 性能优化
  • Persistence  持久化
  • Resource pooling 资源池
  • Synchronization 同步
  • Transactions 事务

关于SpringAOP综述,大概就介绍这些内容,后续我会跟着上面的流程图,先以ProxyFactoryBean的配置为例,进行源码的走读。后面再去了解下<aop:config>这样的配置是如何实现的AOP。题外话:最近手头有项目了,可能博客内容更新会稍微慢点!
0
0
查看评论

做一个合格的程序猿之浅析Spring AOP源码(十八) Spring AOP开发大作战源码解析

其实上一篇文章价值很小,也有重复造轮子的嫌疑,网上AOP的实例很多,不胜枚举,其实我要说的并不是这个,我想要做的就是上一节中spring的配置文件: 我们这边并没有用到我们上几节分析的哪几个AOP的主要实现类:ProxyFactoryBean.java , ProxyFactory.java ,A...
  • linuu
  • linuu
  • 2016-03-26 13:46
  • 1209

spring的IOC与AOP读源码小记

读spring中IOC、AOP事务的一些笔记
  • sgls652709
  • sgls652709
  • 2015-10-29 02:52
  • 1527

杨老师课堂之springAOP事务控制源码解析

spring AOP基于动态代理实现,想看懂源码必须了解动态代理和字节码增强方面的知识。 基于对spring各种配置的了解,首先我们先从DataSourse由谁来管理入手。了解AOP。 一般来讲首先会配置一个datasource,至于你配置什么连接池还是用JNDI这里就不提到细节,总之我...
  • jung285175400
  • jung285175400
  • 2016-05-20 11:29
  • 7039

spring源码剖析(六)AOP实现原理剖析

Spring的AOP实现原理,酝酿了一些日子,写博客之前信心不是很足,所以重新阅读了一边AOP的实现核心代码,而且又从网上找了一些Spring Aop剖析的例子,但是发现挂羊头买狗肉的太多,标题高大上,内容却大部分都是比较浅显的一些介绍,可能也是由于比较少人阅读这部分的核心代码逻辑把,然后写这部分介...
  • fighterandknight
  • fighterandknight
  • 2016-04-23 17:22
  • 19701

spring源码剖析(五)利用AOP实现自定义Spring注解

自定义Spring注解,利用AOP实现自定义Spring注解
  • fighterandknight
  • fighterandknight
  • 2016-04-17 01:29
  • 3446

(八)Spring核心框架 - AOP的原理及源码解析

一、AOP的体系结构 如下图所示:(引自AOP联盟) 层次3语言和开发环境:基础是指待增加对象或者目标对象;切面通常包括对于基础的增加应用;配置是指AOP体系中提供的配置环境或者编织配置,通过该配置AOP将基础和切面结合起来,从而完成切面对目标对象的编织实现。 层次2面向方面系统:配置模型,逻辑...
  • leicool_518
  • leicool_518
  • 2015-02-09 16:31
  • 2995

Spring AOP源码解读1 - 程序入口

前言 最近看了《从零开始写JavaWeb框架》,想比较一下Spring AOP的实现方式和书的上实现方式有什么不同,所以先把Spring AOP的源码读一下,再进行比较。 Spring的源码实在是复杂,在读的过程中参考了很多书和网上的文章,本文算是这些文章的总结,再加上一些我自己对另个细...
  • hotdust
  • hotdust
  • 2016-12-11 17:34
  • 979

Spring学习笔记---4-AOP代码实现及源码解释

一、AOP的实现者       AOP的工作目标就是将横切的问题,如:性能监控,事务处理,日志处理等,进行模块化。使用类似于OOP的方式进行切面的编程工作。位于AOP工具核心的是连接点模型,它提供了一种机制,可以识别出在哪里发生了横切。 ...
  • weikeke410
  • weikeke410
  • 2016-01-18 14:48
  • 679

Spring源码分析——AOP实现(2)

文章深入讲解了Spring中AOP的实现机制和原理以及使用 AOP(Aspect Orient Programming),作为面向对象编程的一种补充,广泛应用于处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等。AOP 实现的关键就在于 AOP 框架自动创建的 AOP 代...
  • ls5718
  • ls5718
  • 2016-06-30 17:04
  • 1911

Spring IOC和Spring AOP的实现原理(源码主线流程)

写在前面       正本文参考了《spring技术内幕》和spring 4.0.5源码。本文只描述原理流程的主线部分,其他比如验证,缓存什么可以具体参考源码理解。 Spring IOC 一、容器初始化       容器的初...
  • u013430196
  • u013430196
  • 2015-09-08 14:33
  • 2346
    个人资料
    • 访问:107683次
    • 积分:1252
    • 等级:
    • 排名:千里之外
    • 原创:41篇
    • 转载:6篇
    • 译文:0篇
    • 评论:20条
    博客专栏
    最新评论