AOP(Aspect-Oriented Programming)

  • 面向切面编程
  • 将复杂的需求分解出不同方面,将散布在系统中的公共功能集中解决
  • 面向切面编程,是一种通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态添加功能的技术

使用“横切”技术,AOP把软件系统分为两部分

  • 核心关注点
  • 横切关注点

实现方法:动态代理设计模式

AOP相关术语

  • 增强(Advice)
  • 切入点(Pointcut)
  • 连接点(Joinpoint)
  • 切面(Aspect)增强(Advice)和切入点(Pointcut)的组合
  • 代理(Proxy)
  • 目标对象(Target)
  • 织入(Weaving)是指实现切面的过程

Aop的实现者

  • AspectJ
  • Jboss Aop
  • Spring Aop 依赖了AspectJ

Spring提供了4种实现Aop的方式

  • 基于代理的经典Aop    在老版本中存在通过代理工厂实现的,现在基本不用了   
  • 纯POJO  通过引入schema文档,把一个普通的java bean配置成切面
  • @ApectJ注解驱动的切面  
  • 注入式AspectJ切面  spring只能对普通方法实现增强,构造方法和属性是不允许的,特殊情况下可以使用AspectJ

表达式匹配规则

  • public * addUser(com.pb.entity.User):  "*"表示匹配所有类型的返回值

  • public void (com.pb.entity.User) : ""表示匹配所有方法名

  • public void addUser (..) : ".. "表示匹配所有参数个数和类型

  • * com.pb.service..(..) : 匹配com.pb.service包下所有类的所有方法

  • * com.pb.service..*(..)  匹配com.pb.service包及子包下所有类的所有方法

使用Aop实现日志的输出

  • 在applicationContext.xml中引入schema文件

  • 定义日志模块类,方法

  • 导入Aop所需的jar文件
    • spring-aop-5.2.9.RELEASE.jar spring自己支持aop的jar包
    • aspectjweaver-1.9.6.jar   spring依赖aspectj框架的jar文件
    • aopalliance-1.0.jar Aop Aliance是 AOP的接口标准,定义了AOP中的基础概念(Advice,CutPoint,Advisor等),为各种AOP实现提供统一的接口。Spring AOP,GUICE都采用了AOP Alliance标准,所以需要导入aopalliance.jar,但是在Spring4.3之后内置了AOP alliance接口,不再需要单独引入aopalliance.jar
    • spring-aspects-5.2.9.RELEASE.jar Spring ships with a small AspectJ aspect library,一个小型的AspectJ的库
  • 编写配置文件
    • 声明目标类(需要增强的类的方法)
    • 配置切面
    • 声明切入点
    • 织入(指定增强方法bean的id,指明切入点,声明织入的方法类型及方法)

  • 运行程序查看结果

在日志输出时,这样输出是不行的,因为我们不知道是哪个类的哪个方法输出的,还有就是在权限控制中我们要判断参数是否安全,这时必须要获取连接点的信息,也就是需要增强的方法的信息,如:所属类,方法名及参数等。那么应该怎么实现呢?

  • 修改日志类,在增强的方法中传入参数JoinPoint jp

    • 如需获取增强的目标方法的返回值,就需要在后置增强中配置returning,指明返回信息的接收对象,然后在后置增强的方法中把接收对象传入进来



    • 接着,再来看下运行结果

JDK 动态代理是通过接口来实现的,面向接口的代理

CGLib  面向类的代理,在运行过程中动态创建子类来进行代理,创建速度慢,执行速度快,会受到final修饰符限制,final修饰的方法和属性不能代理

Spring 会根据情况自动选择代理,如:



在aop:config上设置proxy-target-class="true"为CGlib代理

参考资料:

https://zhuanlan.zhihu.com/p/24565766

https://blog.csdn.net/pingnanlee/article/details/38845955

spring-aop(一)学习笔记的更多相关文章

  1. Spring 源码学习笔记10——Spring AOP

    Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...

  2. Spring 源码学习笔记11——Spring事务

    Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...

  3. Spring源码学习笔记12——总结篇,IOC,Bean的生命周期,三大扩展点

    Spring源码学习笔记12--总结篇,IOC,Bean的生命周期,三大扩展点 参考了Spring 官网文档 https://docs.spring.io/spring-framework/docs/ ...

  4. spring cloud(学习笔记)高可用注册中心(Eureka)的实现(二)

    绪论 前几天我用一种方式实现了spring cloud的高可用,达到两个注册中心,详情见spring cloud(学习笔记)高可用注册中心(Eureka)的实现(一),今天我意外发现,注册中心可以无限 ...

  5. Spring源码学习笔记9——构造器注入及其循环依赖

    Spring源码学习笔记9--构造器注入及其循环依赖 一丶前言 前面我们分析了spring基于字段的和基于set方法注入的原理,但是没有分析第二常用的注入方式(构造器注入)(第一常用字段注入),并且在 ...

  6. Spring中的AOP(学习笔记)

    是什么AOP及实现方式 AOP的基本概念 Schema-base AOP Spring AOP API AspectJ

  7. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring使用AspectJ开发AOP基于XML和基于Annotation

    AspectJ 是一个基于 Java 语言的 AOP 框架,它扩展了 Java 语言.Spring 2.0 以后,新增了对 AspectJ 方式的支持,新版本的 Spring 框架,建议使用 Aspe ...

  8. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring通知类型及使用ProxyFactoryBean创建AOP代理

    通知(Advice)其实就是对目标切入点进行增强的内容,Spring AOP 为通知(Advice)提供了 org.aopalliance.aop.Advice 接口. Spring 通知按照在目标类 ...

  9. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring AOP(面向切面编程)

    面向切面编程(AOP)和面向对象编程(OOP)类似,也是一种编程模式.Spring AOP 是基于 AOP 编程模式的一个框架,它的使用有效减少了系统间的重复代码,达到了模块间的松耦合目的. AOP ...

  10. spring AOP的学习

    1.Spring常用的概念 Joinpoint(连接点): 所谓连接点是指那些被拦截到的点.在spring中,这些点指的是方法,因为spring只支持方法类型的连接点. Pointcut(切入点): ...

随机推荐

  1. java 对 final 关键字 深度理解

    基础理解 : 1.修饰类 当用final去修饰一个类的时候,表示这个类不能被继承.处于安全,在JDK中,被设计为final类的有String.System等,这些类不能被继承 .注意:被修饰的类的成员 ...

  2. Windows下搭建FFmpeg开发调试环境

    背景 如果你是一个FFmpeg的使用者,那么绝大部分情况下只需要在你的程序中引用FFmpeg的libav*相关的头文件,然后在编译阶段链接相关的库即可. 但是如果你想调试FFmpeg内部相关的逻辑,或 ...

  3. Jenkins凭证管理

    目录 一.简介 二.管理凭证 三.常用凭证 保密文本 账号密码 保密文件 账号秘钥 四.优雅使用凭证 保密文本 账号密码 保密文件 五.凭证插件 集成HashiCorp Vault pipeline ...

  4. iphone4 与iphone5适配

    转:http://www.cnblogs.com/ygm900/archive/2013/05/24/3098015.html iphone4/4s 应用程序升级适配 iphone5 的方法有很多,而 ...

  5. LET函数(Excel函数集团)

    LET函数,是个Office365新增函数,所以,还在用上古版本的童鞋请无视此篇哈~ 话说Excel中,有个自定义名称的功能,如下图,左右两个表分别自定义了"data1"和&quo ...

  6. CF764B Timofey and cubes 题解

    Content 有一个序列 \(a_1,a_2,a_3,...,a_n\),对于 \(i\in[1,n]\),只要 \(i\leqslant n-i+1\),就把闭区间 \([i,n-i+1]\) 内 ...

  7. RabbitMQ 消息队列 实现RPC 远程过程调用交互

    #!/usr/bin/env python # Author:Zhangmingda import pika,time import uuid class FibonacciRpcClient(obj ...

  8. element UI遇到的问题

    1. 在el-dialog中获取el-table的ref为undefined 问题:虽然设置了el-dialog的visible为true,但此时Dom并没有更新,因此在Dom更新前取不到el-tab ...

  9. c(++)变长参数之整形(非字符串类型类似)

    0.序言 变长参数,接触的第一个可变长参数函数是 printf   , 然后是 scanf   .他们的原型如下: printf: _Check_return_opt_ _CRT_STDIO_INLI ...

  10. c++之sigslot库

    关于 本文演示环境: win10 + VS2017 1. demo #include <iostream> #include "sigslot.h" using nam ...