AOP的概述
AOP是Aspect Oriented Programming的简称,称为面向切面编程。AOP独辟蹊径通过横向抽取机制为一些类无法通过纵向继承体系进行抽象的重复性代码提供了解决方案。AOP应用的场合是受限的。它一般只适合于那些具有横切逻辑的应用场合:如性能监测、访问控制、事务管理以及日志记录等。
例子:
.....
public class ForumService{
private TransactionManager transManager;
private PerformanceMonitor pmonitor;
private TopicDao topicDao;
private ForumDao forumDao;
public void removeTopic(int topicId){
pmonitor.start();
transManager.beginTransaction();
topicDao.removeTopic(topicId);
transManager.commit();
pmonitor.end();
}
......
}
pmonitor.start()和pmonitor.end()这两个方法是性能监视代码,在方法调用前启动,在方面调用返回时结束,并在内部记录性能监视的结果信息transManager.beginTransaction()和transManager.commit()是事务开始和事务提交的代码。topicDao.removeTopic(topicId)的业务代码存在在重复化非业务性的代码中,性能监视和事务管理这些非业务代码包围着业务代码。我们无法通过抽象父类的方式一样消除重复性的横切代码,因为这些横切逻辑依附在业务类方法的流程中,它们不能转移到其他地方去,所以这时候AOP思想就产生了。
AOP的术语
- 连接点(Join point)
程序执行的某个特定位置:如类开始初始化前、类初始化后、类某个方法调用前、调用后,方法抛出异常后。一个类或一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就称为“连接点”。 - 切点(Pointcut)
每个程序类都拥有多个连接点,如一个拥有两个方法的类,这两个方法都是连接点,但是如何定位到我们需要的连接点上,这时候就需要通过切点来定位特定的连接点。类似于,连接点类似于数据库的记录,而切点就是查询条件,切点与连接点不是一对一的关系,一个切点可以匹配多个连接点。切点只定位到某个方法上,所以如果希望定位到具体连接点上,还需要方位信息。 - 增强(Advice)
增强是织入到目标类连接点上的一段程序代码。这是在程序执行期间通过 Spring AOP 框架实际被调用的代码。在Spring中,增强除用于描述一段程序代码外,还拥有另一个和连接点相关的信息,这便是执行点的方位。结合执行点方位信息和切点信息,我们就可以找到特定的连接点了。 - 目标对象(Target)
增强逻辑的织入目标类。在AOP的帮助下,业务类只实现那些非横切逻辑的程序逻辑,而性能监视和事务管理这些横切逻辑则可以使用AOP动态织入到特定的连接点上。 - 引介(Introduction)
引介是一种特殊的增强,它为类添加一些属性和方法。 - 织入(Weaving)
织入是将增强添加到目标类具体连接点上的过程,AOP像一台织布机,将目标类、增强或者引介通过AOP这台织布机编织在一起。 - 代理(Proxy)
一个类被AOP织入增强后,就产生了一个结果类,它是融合了原类与增强逻辑的代理类。根据不同的代理方式,代理类既可能是和原类具有相同接口的类,也可能就是原类的子类,所以可以采用调用原类相同的方式调用代理类。 - 切面(Aspect)
切面由切点和增强(引介)组成,它既包括了横切逻辑的定义也包括了连接点的定义,SpringAOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的连接点中。
AOP的工作重点在于如何将增强应用在目标对象上的连接点上。