APDPlat中领域模型的自描述机制与事件通知机制

我们先看看Model的设计要点:

自描述2、统一的Model类定义了一个抽象方法getMetaData()public abstract String getMetaData();

@Override public String getMetaData() { return "重建索引日志"; }

@ModelAttr("开始处理时间") protected Date startTime;

接下来我们看看事件通知机制,当领域模型发生CRUD操作的时候,我们能收到事件,是如何做到的呢?看看Model的定义:

@MappedSuperclass@EntityListeners(value = http://yangshangchuan.iteye.com/blog/ModelListener.class)public abstract class Model implements Serializable{

@EntityListeners注解以及@MappedSuperclass注解,所以所有的模型都成了事件源。

所以,需要定义统一的事件通知接口,让ModelListener类成为观察者维护以及事件通知的核心,如下所示:

/** * 模型监听事件调度器 * 可注册与反注册多个ModelHandler的实现 * 相应事件发生的时候,调度器负责转发给所有注册的ModelHandler * @author 杨尚川 * */public class ModelListener {    private static final APDPlatLogger LOG = new APDPlatLogger(ModelListener.class);    private static final List<ModelHandler> modelHandlers = new LinkedList<>();        public static void addModelHandler(ModelHandler modelHandler){        LOG.info("注册模型事件处理器:"+modelHandler.getClass().getName());        modelHandlers.add(modelHandler);    }    public static void removeModelHandler(ModelHandler modelHandler){        LOG.info("移除模型事件处理器:"+modelHandler.getClass().getName());        modelHandlers.remove(modelHandler);    }        @PrePersist    public void prePersist(Model model) {        for(ModelHandler modelHandler : modelHandlers){            modelHandler.prePersist(model);        }    }    @PostPersist    public void postPersist(Model model) {        for(ModelHandler modelHandler : modelHandlers){            modelHandler.postPersist(model);        }    }    @PreRemove    public void preRemove(Model model) {        for(ModelHandler modelHandler : modelHandlers){            modelHandler.preRemove(model);        }    }    @PostRemove    public void postRemove(Model model) {        for(ModelHandler modelHandler : modelHandlers){            modelHandler.postRemove(model);        }    }    @Preupdate    public  void preUpdate(Model model) {        for(ModelHandler modelHandler : modelHandlers){            modelHandler.preUpdate(model);        }    }    @PostUpdate    public void postUpdate(Model model) {        for(ModelHandler modelHandler : modelHandlers){            modelHandler.postUpdate(model);        }    }    @PostLoad    public void postLoad(Model model) {        for(ModelHandler modelHandler : modelHandlers){            modelHandler.postLoad(model);        }    }}

用户只需处理自己感兴趣的事件,而不用处理所有的事件),实现者只需要将自身注册到ModelListener,当事件发生的时候,就能获得通知,这样的设计就是下面看3个具体的观察者实现,这里需要注意的是,这3个观察者是在Spring容器初始化完毕之后( /** * 注册模型处理器 */ @PostC>1、对领域模型进行预处理:

/** * 辅助模型处理器 * @author 杨尚川 */@Servicepublic class AidModelHandler extends ModelHandler{    private static final APDPlatLogger LOG = new APDPlatLogger(AidModelHandler.class);    /**     * 注册模型处理器     */    @PostC>2、业务操作审计

/** * 记录业务操作日志模型事件处理器 * @author 杨尚川 */@Servicepublic class OperateLogModelHandler extends ModelHandler{    private static final APDPlatLogger LOG = new APDPlatLogger(OperateLogModelHandler.class);    private static final boolean CREATE;    private static final boolean DELETE;    private static final boolean UPDATE;        static{        CREATE=PropertyHolder.getBooleanProperty("log.create");        DELETE=PropertyHolder.getBooleanProperty("log.delete");        UPDATE=PropertyHolder.getBooleanProperty("log.update");        if(CREATE){            LOG.info("启用添加数据日志");            LOG.info("Enable create data log", Locale.ENGLISH);        }else{            LOG.info("禁用添加数据日志");            LOG.info("Disable create data log", Locale.ENGLISH);        }        if(DELETE){            LOG.info("启用删除数据日志");            LOG.info("Enable delete data log", Locale.ENGLISH);        }else{            LOG.info("禁用删除数据日志");            LOG.info("Disable delete data log", Locale.ENGLISH);        }        if(UPDATE){            LOG.info("启用更新数据日志");            LOG.info("Enable update data log", Locale.ENGLISH);        }else{            LOG.info("禁用更新数据日志");            LOG.info("Disable update data log", Locale.ENGLISH);        }    }        /**     * 注册模型处理器     */    @PostC>3、实时索引维护

/** * 实时索引模型处理器 * @author 杨尚川 */@Servicepublic class RealtimeIndexModelHandler extends ModelHandler{    private static final APDPlatLogger LOG = new APDPlatLogger(RealtimeIndexModelHandler.class);    @Resource(name = "indexManager")    private IndexManager indexManager;            /**     * 注册模型处理器     */    @PostC>APDPlat托管在Github

赞 (0) 评论 分享 ()

相关阅读

    无相关信息