43

AOP编程思想全解析

 3 years ago
source link: https://blog.shareworld.vip/archives/aop1
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

AOP是一种编程思想,一套规范。

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

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

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

发展历史

1997年在面向对象编程大会上Gregor Kiczales等人首次提出了AOP的概念,之后各大公司等分别加入研究。2001年Palo Alto研究中心发布了首个支持AOP的语言AspectJ,同时也是一个规范。

目标定位

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

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

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

Q7ZR3e6.png!mobile

核心知识点

  • 连接点

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

  • 切入点

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

  • 方面

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

  • 通知

通知:advice,是point cut执行的代码,定义在连接点什么时机来执行aspect。

主要运用场景

场景分为2类:

一类是非功能性需求,如日志、异常、安全、事务都可以使用AOP思想编程。

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

nyqEr2y.png!mobile

主流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编程要慎重使用,作为面向对象编程的一种补充。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK