软件开发的目的最终是为了解决各种需求,包括业务需求和系统需求。使用面向对象的思想,我们可以对业务需求等普通关注点进行很好的抽象和封装,并且使之模块化。但对于系统需求一类的关注点来说,情况有所不同。
对于业务需求而言,需求与具体实现直接的关系基本上是一对一的。我们可以在系统中某一个确定的点找到针对这种需求的实现。
但是在开发测试中或者进入生产环境后需要对系统进行监控,我们需要添加日志功能,除此之外,业务方法的执行可能需要一定的权限限制。那么方法执行前需要有相应的安全检查功能。对于这些系统需求,想要以面向对象的方式实现并集成待整个系统中,不仅仅是一个需求对应一个实现那么简单。可能遍布所有的业务对象。
因此,提出了AOP(面向切面编程),我们可以对类似于logging和security等系统需求进行模块化组织,简化系统需求和实现的对比关系,进而使得整个系统的实现更具模块化。
AOP是一种理念,其实现需要一种方式。就好似OOP需要对应的语言支撑一样。AOP也需要某种语言帮助实现相应的概念实体(AOL)。
静态AOP:相应的横切关注点以Aspect形式实现后,会通过特定的编译器,将实现后的Aspect编织到系统的静态类中。
静态AOP的优点:Aspect直接以java字节码的形式编译到java类。jvm可以想运行类一样运行,不会对系统造成任何性能损失。
静态AOP的缺点:灵活性不够,如果横切关注点需要改变织入位置,需要重新修改Aspect,编织进系统。
动态AOP:AOP的各种概念实体全部都是put的java类,所有容易开发和基础。Aspect和class一样以类的身份作为系统的一员。其织入过程在运行时进行,而不是预先编译织入。而且信息可以采用外部xml等形式保存,在调制编织点时不必变更系统其他模块,甚至在系统运行时,动态更改。但其缺点也很明显,就是在运行时编织,会造成一点的运行时性能损失。