OOP(Object-Oriented Programming)的关键单元是类(class)
AOP(Aspect-Oriented Programming)的关键单元是切面(aspect)。AOP可作为OOP的补充。
新手比较难理解AOP中横切(crosscutting)这个概念。假设这样一个场景:
我们去饭店吃饭
public class People{
public void eat(){
}
}
那么在吃之前肯定要点餐,吃完要付钱
public void Steps{
public void order(){
}
public void pay(){
}
}
在普通OOP程序里,我们先要实例化一个Steps的对象steps,调用steps.order(),在实例化People对象people,调用people.eat(),再调用steps.pay()。
public void Main{
public static void main(args String[ ]){
People people = new People();
Steps steps = new Steps();
steps.order();
peope.eat();
steps.pay();
}
}
而实际中,只有eat()是人最关心的。如果程序在执行eat()的时候,能自动先执行order(),后执行pay()那该多好。
public void Main{
public static void main(String[ ] args){
People people = new People();
peope.eat();
}
}
怎样才能做到这样呢?AOP为我们提供了解决方法:把Steps定义为切面(aspect),order()和pay()为关注点(concerns),people是被横切对象。
那么AOP是怎么实现这种横切的呢?有两种方式:schema-based和 @AspectJ annotation style。
下面根据一个schema-based具体的例子来解释AOP中相关概念。