理解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典型的应用场景:
日志记录,缓存,性能统计,安全控制,权限管理,事务处理,异常处理,资源池管理。
可以看出这些场景都是跨越多个无关的离散的对象,也就是所谓的系统切面。
浙公网安备 33010602011771号