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. 【Linux】【Problems】在fedora 9上解决依赖问题

    summary: 在32bit的fedora9上安装EMC客户端遇到无法解决的依赖问题 detail: rpm 安装: [root@hcszmons02 tmp]# rpm -ivh lgtoclnt ...

  2. Spring 与 SpringBoot 的区别

    概述 Spring 与 SpringBoot 有什么区别???梳理一下 Spring 和 SpringBoot 到底有什么区别,从 Spring 和 SpringBoot 两方面入手. Spring ...

  3. 【C++】结构体/结构体数组/结构体指针/结构体嵌套/函数参数/const

    一.结构体声明 struct Student { //成员列表 string name; int age; int score; }; //s3;定义时直接声明 int main() { struct ...

  4. 一行配置搞定 Spring Boot项目的 log4j2 核弹漏洞!

    相信昨天,很多小伙伴都因为Log4j2的史诗级漏洞忙翻了吧? 看到群里还有小伙伴说公司里还特别建了800+人的群在处理... 好在很快就有了缓解措施和解决方案.同时,log4j2官方也是速度影响发布了 ...

  5. C#编程概述(摘抄)

    C#编程概述 一个简单的C#程序 标识符 标识符是一种字符串,用来命名变量.方法.参数和许多后面将要阐述的其他程序结构. 关键字 所有C#关键字都由小写字母组成,但是.NET类型名使用Pascal大小 ...

  6. HTML行内级元素之间的空格问题

    HTML行内级元素之间的空格问题 1.为什么元素之间会产生空格? 在编写行内级元素(包括inline-block元素)的代码之间如果有空格(换行),在浏览器上就会显示元素之间有空格. 示例代码如下: ...

  7. java 常用类库:时间类LocalDate;LocalTime;LocalDateTime;Calendar 类;Date ;

    LocalDate类 LocalDate类代表不带时区的日期,列入2020-12-20.该类提供了静态的now()方法来获取当前的日期.这个类是线程安全的. LocalTime类 代表不带时区的时间, ...

  8. Postman环境变量的使用

    前言 请注意,Postman新版有ui上的改动,本文使用的Postman 版本8.4.0 for Mac, ui有调整,但是功能无改变. Postman是一款接口调测的软件,服务端开发的同学肯定会对自 ...

  9. 【九度OJ】题目1138:进制转换 解题报告

    [九度OJ]题目1138:进制转换 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1138 题目描述: 将一个长度最多为30 ...

  10. 【九度OJ】题目1169:比较奇偶数个数 解题报告

    [九度OJ]题目1169:比较奇偶数个数 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1169 题目描述: 第一行输入一个数,为n, ...