我创建了几个 DAO 类(我正在使用 Spring JDBC),我想在保存、更新和删除时发出事件,以便我也可以更新搜索索引。
一种方法是在每个 DAO 中创建事件发出逻辑,但这将是很多重复。所以我想到了使用 AOP 和一个“周围的建议”,但我不知道这是否是使用 AOP 的正确“时间”。还有其他更适合的解决方案吗?
我创建了几个 DAO 类(我正在使用 Spring JDBC),我想在保存、更新和删除时发出事件,以便我也可以更新搜索索引。
一种方法是在每个 DAO 中创建事件发出逻辑,但这将是很多重复。所以我想到了使用 AOP 和一个“周围的建议”,但我不知道这是否是使用 AOP 的正确“时间”。还有其他更适合的解决方案吗?
我会通过为所有 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,但即使是这种情况,也可能首选其他一些机制。
您也可以通过使用侦听器来做到这一点。流程有点反转,因为子类利用父类作为各种帮助。
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 操作制作一个单独Collection
的Listener
's,或者根据您的喜好更改它。