理解AOP之“初识”

<后章-理解AOP之"实现">

 

首先,什么是AOP?从概念上来说AOP即Aspect Oriented Programming-面向切面编程,然而这个概念过于的抽象,对于正确理解AOP其实并没有太大的帮助。在我看来AOP是对于传统的OOP的一种延伸一种补充。之所以我们需要AOP,是因为当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。从系统上来说,OOP可以通过继承机制定义从上到下的关系,并从纵向共享代码。然而当我们需要横向的向多个不相关的类分享代码的时候, OOP明显不能很好的满足需求,因为不相关的类是不存在继承关系的。看下面的例子:

public interface Closeable {
   void close();  
}

public class FileSaver implements Closeable{
  public void close() {
      // close file output stream
  }      
}

public class UserDao implements Closeable{
  public void close() {
      // close db connection
  }      
}

FileSaver类和UserDAO类都实现了Closeable接口的close方法,分别关闭文件流和数据库连接。2者没有任何继承关系,因为他们几乎是无关的。目前为止OOP做的很好,但是无论关闭文件流还是数据库连接都有可能抛出异常,我们想捕获异常并且将异常写入错误日志,那么我们必须要分别在2个类的close方法中加入try-catch和写log的代码。那么这就代表着重复的代码会分散在这两个类中。当然我给出的情况是比较简单的,但是实际应用中往往存在类似且更复杂的情况,重复的代码量也远远超过这个例子中的代码。这个时候就是AOP大显神威的时候了。我们可以把对于close操作的异常捕获和日志写入作为一个切面(aspect)来提取出来,然后横向的在FileSaver和UserDao中共享这个切面。这样做的好处有:

1. 更好的复用代码(try-catch以及log的写入)

2. 解除业务对象(UserDao,FileSaver)和错误日志的耦合

3. 业务对象仅关注业务本身,将与业务无关的日志处理提取出去。

 

下面是一些AOP典型的应用场景:

日志记录,缓存,性能统计,安全控制,权限管理,事务处理,异常处理,资源池管理。

 

可以看出这些场景都是跨越多个无关的离散的对象,也就是所谓的系统切面。

posted @ 2016-03-25 23:47  Alex.Li  阅读(130)  评论(0)    收藏  举报