乐趣区

关于aop:AOP编程全解析

AOP 是一种编程思维,一套标准。

软件开发经验了 面向过程 编程时代,以 C 语言为代表,之后是 面向对象 编程时代,以 Java 语言为代表。

在 21 世纪大牛们又提出了一种新的编程思维 面向方面 编程,即 AOP 理念,全称 Aspect-Oriented Programming。

AOP 是第三代编程思维,到哪免不了都要问下。

倒退历史

1997 年在面向对象编程大会上 Gregor Kiczales 等人首次提出了 AOP 的概念,之后各大公司等别离退出钻研。2001 年 Palo Alto 钻研核心公布了首个反对 AOP 的语言 AspectJ,同时也是一个标准。

指标定位

在对真实世界形象的面向对象编程过程中,始终随同着某写操作的代码无奈实现模块化封装,会散落在各个对象中存在,特地是非功能性代码。对于个别的性能开发采取面向对象形式进行形象是可能很好应酬的,然而面向方面(切面)给了一种新的思维形式来思考编程,能更好的进行全局结构化思考。

所以 AOP 次要解决两个问题:

  • 代码扩散问题,特地是那些非功能性代码。
  • 作为面向对象编程思维的一种补充和欠缺。

外围知识点

  • 连接点

连接点:join point,程序的一个执行点,如类中的一个办法,办法外面一个代码块。

  • 切入点

切入点:point cut,是一个捕捉连接点的代码构造,就是定义一个代码逻辑用来捕捉某个连接点的代码。

  • 方面

方面;aspect,是具体被执行的切面逻辑代码,相似于一个类。

  • 告诉

告诉:advice,是 point cut 执行的代码,定义在连接点什么机会来执行 aspect。

次要使用场景

场景分为 2 类:

一类是非功能性需要,如日志、异样、平安、事务都能够应用 AOP 思维编程。

另一类是功能性需要,在原来对象形象的思维中增加 AOP 思维,这里是一种结构化思维,在定义类时思考多个类的切面共性。

支流 AOP 语言实现

对 AOP 实现除了 AspectJ 外,已知的还有 JBoss AOP、Spring AOP 等。

这里只介绍 AspectJ 和 SpringAOP,重点是他们不同点。

AspcetJ

AspectJ 采纳动态织入形式进行切面织入原代码,提供独立的编译器把切面和原代码的 java 文件编织成一个新的 class 文件。提供了具体的编译日志和调试工具,编译工夫长然而运行效率高。

连接点的反对范畴:

  • 办法和结构器调用
  • 办法和结构器执行
  • 属性拜访
  • 异样解决
  • 类初始化,是 static 代码块
  • 语法结构
  • 控制流
  • 对象及参数类型
  • 条件测试

关联连接点告诉形式:

  • before,连接点执行前运行
  • after,连接点执行后运行
  • around,连接点的整个外侧,整个包住,可能绝的连接点执行和批改上下文环境

Spring AOP

Spring AOP 没有齐全实现 AspectJ 语言,它更多的是对 Spring framwork 进行 Aop 能力的扩大实现,补全 Spring framework 的有余并让 Aop 与 Spring framwork 交融。

连接点只反对办法拦挡调用。

连接点告诉形式在 aspect 的 before、after、around 的根底上减少 throw 对异样的触发的拦挡。

Spring AOP 与 Spring IoC 体系交融,对于 aspect 类对立交由 Spring beans 治理,并且提供 ProxyFactoryBean 的 AOP 代理工厂类,还有主动代理的 BeanNameAutoProxyCreator 和 DefaultAdvisorAutoProxyCreator 的弱小工具。

Spring AOP 是动静织入,在运行时实现 AOP 的 aspect 代码织入原代码逻辑中。其底层默认采纳 JDK 的动静代理实现 AOP 代理,当对象没有实现接口时,CGLIB 会默认应用。

优缺点

长处:解决代码散乱问题、代码逻辑解偶、易于保护、提供扩展性和可重用性。

毛病:切面越多零碎越简单难懂、工程师学习成本增加(业务不再是线型,变成了跳跃式)

AOP 编程要谨慎应用,作为面向对象编程的一种补充。

作者:Owen Jia

关注他的博客:https://blog.shareworld.vip

退出移动版