什么是AOP:

我的理解是 把系统性的编程工作封装起来 =》我给这个取个名字叫 “Aspect”,然后通过AOP技术把它切进我们的业务逻辑代码 =》 “业务“

这样的好处:

“Aspect” 和 “业务” 相互独立,既可以让“业务” 用到了 “Aspect” 又让2者互相独立不耦合,多个“业务”也能复用 同一份“Aspect”

举一个最实用的例子 Transaction 事物

我们经常会在业务代码上使用Transaction事物,比如使用TransactionScope:

下面的测试代码用到了我在维护的一个开源ORM框架

https://github.com/yuzd/AntData.ORM

示例业务代码:

上面的代码 就是 插入一个学校到db 然后拿到主键 赋值给 person 再insert到db。 在同一个事物里面 要么school 和person 同时插入db 要么都失败。

实际业务代码肯定比这个要复杂的多了,比如多个方法在一个事物里面等我这里就举最简单的例子。

那么如果每段业务逻辑都这么写的话 会造成重复性代码很多,下面我们就尝试用AOP面向对切的思想去优化

思考怎样的方式才是我想要的

示例代码:

如上图: 我在需要用到事物的方法上面打了一个 EnableTransactionScope 标签 这样遇到业务方法需要用事物包裹的话 都可以打上这个标签

假如要实现这样的话 得实现以下几点:

  1. 我需要代理类,因为只有代理类才能给业务代码做些手脚(织入我们想要的逻辑包裹)
  2. 我需要一个DI容器,因为将实例的生成交给DI容器了会很方面的生成代理类
  3. 我希望只是打打标签就能实现以上这些,这样可视化最好,也方便

朝着目标去实现它 Just Do It

1. 使用Autofac 这款DI容器 配合 Autofac.Extras.DynamicProxy 库

这2个库都是autofac旗下现成的开源产品,有了这2个库 就满足我上面提到的需求1和需求2

第3点看来得亲自动手了

~~

Autofac.Annotation组件诞生

这个组件是我维护的一个开源的autofac扩展库,用来实现打打标签 就能实现一些复杂的配置!

2. 如何使用 Autofac.Annotation 帮助实现AOP面向切面编程

先简单来个示例代码:

更多示例请查阅:https://github.com/yuzd/Autofac.Annotation

3. 使用织入来实现TransactionScope切面

新建一个class如下继承PointcutAttribute 并实现方法: 注意:由于是异步环境 必须使用 new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)

只需要在在需要事物包裹的方法上打上这个标签 [EnableTransactionScope] 如下图:

点我查看以上代码

总结

使用Autofac.Annotation组件可以很方便的让我们在业务代码中使用AOP切面,可以自定义实现切入的位置(前置,后置,还是Arround等)

参考上面代码,

  • 打了Componet标签就把类注入到autofac容器了
  • 打了Aspect标签就代表该类需要autofac帮我生成代理类
  • 方法上面打了指定的标签(前置,后置,环绕,PointCut四种)代表要织入的逻辑

织入类型实现规则说明前置织入继承AspectBeforeAttribute在进入业务代码之前先执行【前置织入逻辑-》业务代码】后置织入继承AspectAfterAttribute在业务代码执行之后执行(即使有异常)【业务代码-》后置织入逻辑】环绕织入继承AspectAroundAttribute在业务代码之前和之前都执行【前置织入逻辑-》业务代码-》后置织入逻辑】PointCut织入继承PointcutAttribute掌控业务代码的执行权,这种最灵活【本文的TransactionScope功能就得用到它】

作者:鱼东东;出处:https://www.cnblogs.com/yudongdong/p/11609262.html

切面是异步还是同步操作‘_Autofac的AOP面向切面编程研究相关推荐

  1. 切面是异步还是同步操作‘_【 .NET Core 3.0 】框架之十 || AOP 切面思想

    本文有配套视频: https://www.bilibili.com/video/av58096866/?p=6 前言 上回<[ .NET Core3.0 ]框架之九 || 依赖注入IoC学习 + ...

  2. Autofac的AOP面向切面编程研究

    我的理解是 把系统性的编程工作封装起来 =>我给这个取个名字叫 "Aspect",然后通过AOP技术把它切进我们的业务逻辑代码 => "业务" 这样 ...

  3. java aop面向切面编程

    最近一直在学java的spring boot,一直没有弄明白aop面向切面编程是什么意思.看到一篇文章写得很清楚,终于弄明白了,原来跟python的装饰器一样的效果.http://www.cnblog ...

  4. 【AOP 面向切面编程】Android Studio 使用 AspectJ 监控方法运行原理分析

    文章目录 一.查看使用 AspectJ 后生成的 Class 字节码类 二.AspectJ 的本质 一.查看使用 AspectJ 后生成的 Class 字节码类 在 Android Studio 中查 ...

  5. 【AOP 面向切面编程】Android Studio 中配置 AspectJ ( 下载并配置AS中 jar 包 | 配置 Gradle 和 Gradle 插件版本 | 配置 Gradle 构建脚本 )

    文章目录 一.AspectJ 下载 二.拷贝 aspectjrt.jar 到 Android Studio 三.配置 Gradle 和 Gradle 插件版本 四.配置 Gradle 构建脚本 一.A ...

  6. 【AOP 面向切面编程】AOP 简介 ( AspectJ 简介 | AspectJ 下载 )

    文章目录 一.AOP 简介 二.AspectJ 简介 三.AspectJ 下载 一.AOP 简介 AOP 是 Aspect Oriented Programming 的缩写 , 面向切面编程 ; 利用 ...

  7. Spring 详解(三):AOP 面向切面的编程

    AOP即面向切面编程,它通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型. ...

  8. Javascript aop(面向切面编程)之around(环绕)

    Aop又叫面向切面编程,其中"通知"是切面的具体实现,分为before(前置通知).after(后置通知).around(环绕通知),用过spring的同学肯定对它非常熟悉,而在j ...

  9. 大数据WEB阶段Spring框架 AOP面向切面编程(一)

    Spring - AOP面向切面编程(一) 一.代理模式概述 代理的特点:(目标对象即被代理者) 实现和目标对象相同的接口 具备和目标对象的方法 代理者不仅要做目标对象的方法 , 还要做一些额外的操作 ...

最新文章

  1. Kubernetes入门——Kubernetes实现应用的高可用
  2. QT的QMutableListIterator类的使用
  3. 时间序列 线性回归 区别_时间序列分析的完整介绍(带R)::线性过程I
  4. Memcached的基础梳理
  5. 【翻译】在Ext JS中创建特定主题的重写
  6. 作者:伍筱聪(1989-),女,中国科学院上海天文台助理工程师
  7. J2SE基础夯实系列之正则表达式Java
  8. 改变你一生的五句话 (转)
  9. opacity 设置不透明度、visibility 设置是否可见、transition 设置过渡动画
  10. 电赛公开课整理(二),电路基础,截图+模电知识【16000字】【原创】
  11. 学习C语言编程必备的入门书籍
  12. 最新 IOS应用开发Icon规格自动裁剪器(C#)
  13. Windows使用批处理文件更改指定目录下的文件名(含序号)
  14. Pathon安装教程环境配置教程(Pathon2.7和3.7的区别)
  15. 电视html转vga没有声音,手把手教你排除HDMI转VGA常见故障
  16. VL53L0X+stm32激光测距
  17. jq、js 添加/删除class
  18. 网络测试仪哪个牌子好
  19. 二级C语言上机考试评分标准,浅谈二级C语言上机考试评分原理
  20. SqlServer 迁移到达梦数据库 nvarcher 的避坑指南

热门文章

  1. mysql2003错误如何解决_如何安装最新版redis6错误解决以及配置开机启动等
  2. unittest 多个测试文件只开一次浏览器_接口测试平台代码实现75: 多接口用例15
  3. 字节/阿里/ 百度2021年Java岗发布+最新内部面试题
  4. tomcat基本使用,就是这么简单
  5. 【深入Java虚拟机JVM 09】JVM垃圾回收finalize方法--对象最有一次自我拯救
  6. (仿头条APP项目)2.主界面按钮切换Fragment页面
  7. soap方式的远程调用示例代码
  8. 括号匹配编码c语言,用c语言实现括号匹配算法
  9. linux显示存储与标定不符,找到了linux分区顺序错乱修复方法
  10. matlab中的图像,MATLAB中图像的基本操作