在保存,更新和删除时发出事件的DAO

时间:2013-03-24 18:33:43

标签: java spring jdbc spring-jdbc

我创建了几个DAO类(我使用的是Spring JDBC),我想在保存,更新和删除时发出事件,这样我也可以更新搜索索引。

一种方法是在每个DAO中创建事件发射逻辑,但这将是很多的重复。所以我想到了使用AOP和“围绕建议”,但我不知道这是否是使用AOP的正确“时间”。还有其他解决方案更合适吗?

2 个答案:

答案 0 :(得分:2)

我会通过为所有CRUD dao创建一个抽象基类来实现这一点。基接口将采用某种回调机制,看起来像这样:

public abstract class AbstractCrudDao<T> {
    public void create(T t, CompleteCallback completeCallback)
    {
        create(t);
        completeCallback.onComplete();
    }

    public abstract void create(T t);

    //same for read, update, delete

    public interface CompleteCallback {
        void onComplete();
    }
}

显然这是一个远非完整的例子,但我认为它展示了利用回调作为完成触发器的想法。您可以进一步扩展接口以接收onException事件。

如果您正在使用Spring的交易管理,您可能需要根据您是否希望在交易内部或外部发生回调事件来进行进一步调整。

就个人而言,除非您不拥有DAO代码,否则我不会使用AOP,但即使是这种情况,也可能首选其他机制。

答案 1 :(得分:2)

您也可以使用侦听器来完成此操作。流程稍微颠倒了一点,因为子类使用父类作为各种帮助。

public abstract class AbstractCrudDao<T> {
    private Collection<Listener> listeners = new HashSet<Listener>();

    public void addListener(final Listener listener) {
        listeners.add(listener);
    }

    protected void doAction(CrudAction<T> crudAction)
    {
        for(Listener listener : listeners) {
             listener.beforeAction();
        }
        crudAction.doAction();
        for(Listener listener : listeners) {
             listener.afterAction();
        }
    }

    public interface CrudAction {
        void doAction();
    }

    public interface Listener {
        void beforeAction();
        void afterAction();
    }
}

public class CarDao extends AbstractCrudDao {
    public void create(Car car) {
        doAction(new CrudAction() {
            public void doAction() {
                //create car here
            }
        });
    }
}

您可以为每个CRUD操作单独CollectionListener,或者根据自己的喜好更改它。