为什么要使用AOP

首先,按照软件重构思想的理念,如果多个类中出现相同的代码,应该考虑定义一个共同的抽象类,将这些相同的代码提取到抽象类当中去。比如Horse、Pig、Camel这些对象都有run()、eat()方法,通过引入一个包含这两个方法抽象的Animal父类,Horse、Pig、Camel就可以通过集成Animal复用到run()和eat()方法。通过引入父类消除多个类中的重复代码的方式在大多数情况下是可行的,但世界并非永远这么简单,比如下面所示的景区管理业务类。

import com.smart.dao.ViewPointDao;
import com.smart.dao.ViewSpaceDao;
import com.smart.domain.ViewSpace;

/**
 * 景区管理的服务类
 */
public class ViewSpaceService {

    private TransactionManager transManager;
    private PerformanceMonitor pmonitor;
    private ViewSpaceDao viewSpaceDao;
    private ViewPointDao viewPointDao;

    /**
     * 新增一个旅游景区
     *
     * @param viewSpace
     */
    public void addViewSpace(ViewSpace viewSpace) {
        pmonitor.start();
        transManager.beginTransaction();
        viewSpaceDao.addViewSpace(viewSpace);
        transManager.endTransaction();
        pmonitor.end();
    }


    /**
     * 删除某个景点
     *
     * @param pointId
     */
    public void deleteViewPoint(int pointId) {
        pmonitor.start();
        transManager.beginTransaction();
        viewPointDao.deleteViewPoint(pointId);
        transManager.endTransaction();
        pmonitor.end();
    }

}
为什么要使用AOP为什么要使用AOP

其中pmonitor是方法性能监视代码,它在方法调用前启动,在方法调用返回前结束,并在内部记录性能监视的结果信息。
其中transManager的代码是事务开始和事务提交的代码,我们发现我们的业务代码淹没在重复化非业务性的代码之中,性能监视和事务管理这些非业务性代码葛藤缠树搬包围着业务性代码。

此时我们就不能通过抽象父类的方式消除以上的重复性代码,因为这些逻辑依附在业务类方法的流程中,它们不能够转移到其他地方去。于是产生了AOP这种思想。