1、横切关注点(cross-cutting concern)

  软件开发中,散布于应用中多处的功能被称为横切关注点,如事务、日志、安全。

  横切关注点从概念上是与应用的业务逻辑相分离的(但是往往会直接嵌入到应用的业务逻辑中),而把横切关注点和业务逻辑分离正是AOP要解决的问题。

  DI用于应用对象之间的解耦,AOP实现横切关注点与他们所影响的对象之间的解耦。

  2、重用通用功能,最常见的技术是继承和委托

  继承会导致脆弱的对象体系;委托可能需要对委托对象进行复杂的调用。

  所以用切面取而代之。

  3、AOP术语

  Aspect:切面——把横切关注点模块化为特殊的类,这些类称为切面。

  Advice:通知or增强——所要增强or增加的功能,模式有Before、After、After-returning,、After-throwing、Around

  Join Point:连接点——应用执行过程中,能够插入切面的所有“点”(时机)

  Pointcut:切点——实际运行中,选择插入切面的连接点,即定义了哪些点得到了增强。

  Introduction:引入——向现有的类添加新方法和属性。

  Weaving:织入——把切面应用到目标对象并创建新的代理对象的过程。(也可以为植入)

  4、在目标对象的生命周期中,有多个点可以进行织入:

  • 编译期——需要特殊的编译器,AspectJ的织入编译器是以这种方式织入切面。
  • 类加载期——切面在目标类加载到JVM时被织入,需要特殊的类加载器(ClassLoader),使目标类被导入应用之前增强该目标类的字节码。
  • 运行期——切面在应用运行的某个时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态创建一个代理对象,Spring AOP以这种方式织入切面!

  

  5、Spring中提供了4种类型的AOP支持

  • 基于代理的经典Spring AOP;
  • 纯POJO切面——XML配置
  • @AspectJ注解驱动的切面——无需XML配置
  • 注入式AspectJ切面

  前三种是Spring AOP实现的变体,Spring AOP构建在动态代理基础上,因此,Spring对AOP的支持局限于方法拦截。如果你的AOP需求超过了简单的方法调用,如构造器或者属性拦截,那么你需要考虑使用AspectJ来实现切面

  6、Spring创建的通知都是用标准的Java类编写的,定义通知应用的切点可以使用注解或在Spring配置文件中用XML编写。

  AspectJ则用特有的AOP语言,可以获得更强大和细粒度的控制。

  7、Spring在运行时通知/增强目标对象——动态代理

  Spring中的切面由包裹了目标对象的代理类实现。代理类拦截并处理方法的调用,执行额外的切面逻辑,然后再调用目标对象的方法。

  那代理对象是什么时候创建的呢?

  当应用需要被代理的bean时,Spring才创建代理对象。

  被代理的对象(目标对象)又是什么时候创建?

  如果使用AppplicationContext,AppplicationContext从BeanFactory中加载所有bean时,Spring创建被代理对象。

  8、Spring只支持方法级别的连接点。

  AOP中连接点的模型有多种,如字段和构造器接入点。

  由于Spring基于动态代理,所以只支持方法连接点,因此无法创建细粒度的通知。

  如果需要方法拦截之外的连接点拦截功能,需要利用AspectJ补充Spring AOP。

Spring实战(九)AOP概念以及Spring AOP的更多相关文章

  1. Spring实战(十一) 在Spring XML中配置AOP

    如果你没有源码,不能为通知类添加注解,又不想将AspectJ注解放入到你的代码中,必须选择XML配置了. 1.Spring XML配置文件 解析参考:http://www.cnblogs.com/bi ...

  2. 将Spring实战第5版中Spring HATEOAS部分代码迁移到Spring HATEOAS 1.0

    最近在阅读Spring实战第五版中文版,书中第6章关于Spring HATEOAS部分代码使用的是Spring HATEOAS 0.25的版本,而最新的Spring HATEOAS 1.0对旧版的AP ...

  3. Spring实战(十二) Spring中注入AspectJ切面

    1.Spring AOP与AspectJ Spring AOP与AspectJ相比,是一个功能比较弱的AOP解决方案. AspectJ提供了许多它不能支持的类型切点,如在创建对象时应用通知,构造器切点 ...

  4. 【Spring实战】----开篇(包含系列目录链接)

    [Spring实战]----开篇(包含系列目录链接) 置顶2016年11月10日 11:12:56 阅读数:3617 终于还是要对Spring进行解剖,接下来Spring实战篇系列会以应用了Sprin ...

  5. spring实战五之Bean的自动检测

    在spring实战四中,使用在Spring中增加<context:annotation-config>的方式告诉Spring,我们打算使用基于注解的自动装配,希望Spring特殊对待我们所 ...

  6. Spring实战 (第3版)——AOP

    在软件开发中,分布于应用中多处的功能被称为横切关注点.通常,这些横切关注点从概念上是与应用的 业务逻辑相分离的(但是往往直接嵌入到应用的业务逻辑之中).将这些横切关注点与业务逻辑相分离正是 面向切面编 ...

  7. Spring+IOC(DI)+AOP概念及优缺点

    Spring pring是一个轻量级的DI和AOP容器框架. 说它轻量级有一大部分原因是相对与EJB的(虽然本人从没有接触过EJB的应用),重要的是,Spring是非侵入式的,基于spring开发的应 ...

  8. Spring 3 AOP 概念及完整示例

    AOP概念 AOP(Aspect Oriented Programming),即面向切面编程(也叫面向方面编程,面向方法编程).其主要作用是,在不修改源代码的情况下给某个或者一组操作添加额外的功能.像 ...

  9. spring学习九 spring aop详解

    本文来自于:https://www.cnblogs.com/jingzhishen/p/4980551.html AOP(Aspect-Oriented Programming,面向方面编程),可以说 ...

随机推荐

  1. flask 第九篇 蓝图 Blueprint

    蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? 比如说,你有一个客户管理系统,最开始的时候,只有一个查看 ...

  2. IDEA checkout Git 分支 弹出 Git Checkout Problem

    1. 本地分支切换的时候(例如A切到B),会弹出来Restore workspace on branch switching 对话框,如果选择是的话,在切换分支的时候,你在当前分支(A)所做的一些还未 ...

  3. OUC_Summer Training_ DIV2_#7 718

    是18号做的题啦,现在才把报告补上是以前不重视报告的原因吧,不过现在真的很喜欢写报告,也希望能写一些有意义的东西出来. A - Dragons Time Limit:2000MS     Memory ...

  4. Nginx之核心结构体ngx_cycle_t

    1. ngx_listening_t 结构体 ngx_cycle_t 对象中有一个动态数组成员叫做 listening,它的每个数组元素都是 ngx_listening_t 结构体,而每个 ngx_l ...

  5. phpstorm配置了git后Terminal 不能使用显示:git' 不是内部或外部命令,也不是可运行的程序

    问题:在phpstorm上配置好git后,将代码拉了下来 ,但是命令行无法使用显示如图 解决方法:①找到安装git的位置,然后在该目录的子目录下分别找到git-core.bin 两个目录,我的安装在了 ...

  6. Hbuilder用自有证书打包 ios App上架AppStore流程

    最近在用Hbuilder做跨平台开发,经过一番研究终于在苹果商店上架成功了一款产品!这款产品就很简单,直接用hbuilder打包好,然后上传到商店即可.这里参照ios app提交应用商店 这篇文章结合 ...

  7. 深度学习之DCGAN

    1.知识点 """ DCGAN:相比GAN而言,使用了卷积网络替代全连接 卷积:256*256*3 --- > 28*28*14 -->结果 ,即H,W变小, ...

  8. python 连接 hive

    1.python连接hive,其实是连接hiveserver,连接的包的impyla impyla安装: error: cc1plus 没有文件或目录 需要安装gcc 和g++,并且版本保持一致 er ...

  9. JAVA 基础编程练习题5 【程序 5 判断分数等级】

    5 [程序 5 判断分数等级] 题目:利用条件运算符的嵌套来完成此题:学习成绩>=90 分的同学用 A 表示,60-89 分之间的用 B 表示, 60 分以下的用 C 表示. 程序分析:(a&g ...

  10. React Native使用Mobx总结

    参考博客: http://www.jianshu.com/p/505d9d9fe36a    这是我看的学习Mobx目前为止觉得最详细学习的博客了. 下面只是记录下我的学习和一些简单的使用: 需要引入 ...