AOP 插件就这?上手不用两分钟!!

简介: 项目一览这个 demo 分为两个模块 :👉 插件模块 springboot-aop-plugin👉 业务模块 springboot-aop-plugin-used


项目一览


这个 demo 分为两个模块 :


👉 插件模块springboot-aop-plugin


👉 业务模块springboot-aop-plugin-used


网络异常,图片无法展示
|

模块功能介绍


模块功能介绍


👉 插件模块springboot-aop-plugin 里面提供两个插件


  1. 插件 A MethodCountingTimesPlugin : 统计方法调用次数


  1. 插件 B MethodSpendTimePlugin : 计算调用方法所花费的时间


👉 业务模块springboot-aop-plugin-used


  1. 提供业务 API


  1. 插件配置类,主要负责 解析


  1. 插件工厂,主要负责 加载,激活和停用插件


网络异常,图片无法展示
|


模块功能介绍

使用


插件模块 打包成一个 jar 包,然后在 业务模块 中配置好 plugins.jsonjar 包地址,随后 激活/停用插件,就可以在控制台看到不同的输出效果啦😄


原理图 👇


主要知识点


  1. 类加载器


  1. Spring AOP 编程式


网络异常,图片无法展示
|


效果演示


API 如下🐖


网络异常,图片无法展示
|


激活插件1


调用方法时会统计该方法的调用次数

网络异常,图片无法展示
|


关闭插件1


网络异常,图片无法展示
|


再次激活插件1


顺便激活插件2 效果


网络异常,图片无法展示
|


还挺好玩的 哈哈 其他就等小伙伴们自己优化了 🐷


主要源码说明


MethodCountingTimesPlugin
插件通过实现这个 MethodBeforeAdvice 来达到 @Before 注解的效果


MethodSpendTimePlugin 插件通过实现这个 MethodInterceptor 来达到 @Around 注解的效果


这部分的知识点可以看上篇文章 👉《Spring AOP内功修炼!!》


代码也很简单,就不多介绍啦👇


网络异常,图片无法展示
|


PluginConfig


这个配置类呢,就是在初始化时去加载,解析这个配置文件 plugins.json,然后放到这个 map 中


网络异常,图片无法展示
|


DefaultPluginFactory


激活插件方法如下 👇


也就是通过这个 编程式AOP 来实现


网络异常,图片无法展示
|


完整项目在 Github 上,链接在文末自取就可以啦~


接下来说说搭建这个小demo 遇到的坑🕳


坑🕳


  1. 打包插件模块,这里我们用到的是 spring-boot-maven-plugin 插件,打包时会去查找有 main 方法的类,并修改 jar 包结构为 BOOT-INF/classes/ ,这样打出来的包,会导致加载插件时无法解析出增强类,一直都是 ClassNotFoundException


  1. ClassLoader 的不同,本次 demo 使用的是 JDK11,而在 JDK11 中,AppclassLoader 无法再转换为 URLClassLoader ,区别如下👇


JDK11


网络异常,图片无法展示
|


JDK8


网络异常,图片无法展示
|


所以在 JDK11 中无法通过将 AppclassLoader 转换成 URLClassLoader 去判断有没有加载过某个 jar 包


问题思考


完成这个 demo 后,4ye 对 AOP 又有了以下的这些思考~


一. AOP 发生的条件


我们都知道 AOP面向切面编程 ,所以我们得告诉它往哪里切,才有机会创建这个 代理对象 出来~


比如 Spring 提供的这几个注解


  • 事务 @Transactional


  • 异步 @Async


  • 缓存 @Cacheable , @CacheEvict@CachePut , @Caching

这些在 spring-aspects 模块中


关于 Spring 的模块可以参考这篇文章 👉 《Spring的这七大模块你了解吗?》

同时,创建代理对象时,CGLIB 只能代理 非final 类中的 非final非static 方法。


二. 为啥采用编程式的AOP


这就突出它的优点啦!毕竟编程式才是最灵活的 哈哈。就像 编程式事务 一样,你可以控制事务的粒度,在编程式 AOP 中,你可以控制 Advice 的启动,停止。


三. 优化地方


  1. MethodCountingTimesPlugin 中是通过 map 来存放不同方法的调用次数的,这个 key 需要考虑怎么和方法挂钩起来,并且唯一 (待优化)


 1.实现配置文件的热更新,以及刷新缓存的 Advice (待优化)


新发现


我们这篇的主题是插件,插件可插拔的特点十分方便,同时,我们利用 ClassLoader 实现了 热加载!


但是呢,我了解到它不仅仅有这个功能,它还可以实现对 class 文件的加解密,同时 4ye 也是间接了解到这个 阿里的 pandora 以及解锁了新的源码篇章 spring boot devtools ,很有意思的,争取早点分享出来 嘿嘿 😋




目录
相关文章
|
Java 数据库连接 数据库
MyBatis与Spring集成&常用注解以及AOP和PageHelper分页插件整合
MyBatis与Spring集成&常用注解以及AOP和PageHelper分页插件整合
102 0
|
Java 数据库连接 Spring
Spring与Mybatis整合&&aop整合pageHelper分页插件2
Spring与Mybatis整合&&aop整合pageHelper分页插件2
76 0
|
Java 数据库连接 Maven
Spring与Mybatis整合&&aop整合pageHelper分页插件1
Spring与Mybatis整合&&aop整合pageHelper分页插件1
121 0
|
Java Android开发
【AOP 面向切面编程】Android Studio 中配置 AspectJ ( 下载并配置AS中 jar 包 | 配置 Gradle 和 Gradle 插件版本 | 配置 Gradle 构建脚本 )(一)
【AOP 面向切面编程】Android Studio 中配置 AspectJ ( 下载并配置AS中 jar 包 | 配置 Gradle 和 Gradle 插件版本 | 配置 Gradle 构建脚本 )(一)
525 0
【AOP 面向切面编程】Android Studio 中配置 AspectJ ( 下载并配置AS中 jar 包 | 配置 Gradle 和 Gradle 插件版本 | 配置 Gradle 构建脚本 )(一)
|
Java 数据库连接 测试技术
Spring与MyBatis集成 AOP整合PageHelper插件
Spring与MyBatis集成 AOP整合PageHelper插件
59 0
|
11月前
|
Java 数据库连接 Spring
mybatis与spring集成/spring aop集成pagehelper插件
mybatis与spring集成/spring aop集成pagehelper插件
49 0
|
Java 数据库连接 数据库
Mybatis与Spring整合以及Aop整合pagehelper插件
Mybatis与Spring整合以及Aop整合pagehelper插件
60 0
|
XML Java 数据库连接
mybatis与spring集成与spring aop集成pagehelper插件
mybatis与spring集成与spring aop集成pagehelper插件
48 0
|
Java 数据库连接 数据库
Mybatis系列(四)之Mybatis与Spring整合以及Aop整合pagehelper插件
Mybatis系列(四)之Mybatis与Spring整合以及Aop整合pagehelper插件
|
Java 调度 Spring
【Logback+Spring-Aop】实现全面生态化的全链路日志追踪系统服务插件「SpringAOP 整合篇」
【Logback+Spring-Aop】实现全面生态化的全链路日志追踪系统服务插件「SpringAOP 整合篇」
360 0
【Logback+Spring-Aop】实现全面生态化的全链路日志追踪系统服务插件「SpringAOP 整合篇」