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. Spring Boot with H2 Database

    Learn to configure H2 database with Spring boot to create and use an in-memory database in runtime, ...

  2. 使用 IntelliJ IDEA 远程调试 Tomcat

    一.本地 Remote Server 配置 添加一个Remote Server 如下图所示 1. 复制JVM配置参数,第二步有用 2. 填入远程tomcat主机的IP地址和想开启的调试端口(自定义) ...

  3. JavaMoney规范(JSR 354)与对应实现解读

    一.概述 1.1 当前现状 当前JDK中用来表达货币的类为java.util.Currency,这个类仅仅能够表示按照**[ISO-4217]**描述的货币类型.它没有与之关联的数值,也不能描述规范外 ...

  4. vue3官网介绍,安装,创建一个vue实例

    前言:这一章主要是vue的介绍.安装.以及如何创建一个vue实例. 一.vue介绍 vue3中文官网:建议先自己看官网. https://v3.cn.vuejs.org/ vue是渐进式框架,渐进式指 ...

  5. 合并函数Combiner.Combine…(Power Query 之 M 语言)

    按相同分隔符合并: =Combiner.CombineTextByDelimiter("分隔符", 引号字符) 分隔符 直接输入 特殊符号 制表符:#(tab) 回车:#(cr) ...

  6. Hooks中的useState

    Hooks中的useState React的数据是自顶向下单向流动的,即从父组件到子组件中,组件的数据存储在props和state中,实际上在任何应用中,数据都是必不可少的,我们需要直接的改变页面上一 ...

  7. CF1095B Array Stabilization 题解

    Content 有一个长度为 \(n\) 的数组 \(a_1,a_2,a_3,...,a_n\),现在需要从这些数中删除一个数,使得 \(\max\limits_{i=1}^na_i-\min\lim ...

  8. SpringBoot使用@Async实现异步调用

    1.@EnableAsync 首先,我们需要在启动类上添加  @EnableAsync 注解来声明开启异步方法. @SpringBootApplication @EnableAsync public ...

  9. Github访问加速(解决md图片显示问题)

    参考自知乎:https://zhuanlan.zhihu.com/p/107691233 基本步骤 查找域名对应IP https://www.ipaddress.com http://tool.chi ...

  10. 【LeetCode】253. Meeting Rooms II 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 排序+堆 日期 题目地址:https://leetco ...