Model Listeners实现ModelListener接口,用于持久化时的AOP处理

一些使用场景:

  • Audit Listener: 在一个独立而分离的数据库,做信息更新的审计;
  • Cache Clearing Listener: 缓存清除时做的额外定制处理;
  • Validation Listener: 实体的验证
  • Entity Update Listener: 实体的更新处理

在一个实体模型上可以有多个侦听器,并且无法控制他们运行的顺序。

Liferay7中你只需要处理2件事情,比6.2要简单:

  • 1、实现 ModelListener
  • 2、在Liferay’s OSGi运行时自动注册服务

在Liferay7中的写法:

package ...;

import ...;

@Component(
immediate = true,
service = ModelListener.class
)
public class CustomEntityListener extends BaseModelListener<CustomEntity> { /* Override one or more methods from the ModelListener
interface.
*/
@Override
public void onAfterCreate(CustomEntity entity) throws ModelListenerException {
...
}
}

在Liferay7中不用编写docroot/WEB-INF/liferay-hook.xml,增加<portal-properties>portal.properties</portal-properties>,方便很多

在Liferay6中的写法:

package com.liferay.samples.hooks;

import com.liferay.portal.ModelListenerException;
import com.liferay.portal.model.BaseModelListener;
import com.liferay.portal.model.User; public class MyUserListener extends BaseModelListener<User> { @Override
public void onAfterCreate(User user) throws ModelListenerException {
  System.out.println(user.getFullName());
} public void onAfterUpdate(User user) throws ModelListenerException {
  System.out.println(user.getFullName());
}
}

CustomEntity用于告诉监听器,实体模型的类型。

注册Liferay’s OSGi runtime:

@Component(
immediate = true,
service = ModelListener.class
)

可以实现的模型事件:

  • onAfterAddAssociation: 处理关联模型的AfterAdd
  • onAfterCreate: 在模型的DAO持久化类中Cearte事件之后,做些你的业务逻辑
  • onAfterRemove: 在模型的DAO持久化类中Remove事件之后,做些你的业务逻辑
  • onAfterRemoveAssociation: 处理关联模型的AfterRemove
  • onAfterUpdate: 在模型的DAO持久化类中Update事件之后,做些你的业务逻辑
  • onBeforeAddAssociation:
  • onBeforeCreate:
  • onBeforeRemove:
  • onBeforeRemoveAssociation:
  • onBeforeUpdate:

如果你熟悉Spring的AOP,是不是有种似曾相识的感觉,这就是Liferay7方式的AOP,好处是可以和之前的旧业务处理代码解耦(你可以做一个新的独立的ModelListener工程)
而不是在DAO持久化类或Service中去添加业务代码。
Hook钩子的其中实现方法之一就是基于Model Listeners

Liferay7 BPM门户开发之22: Liferay7模型监听器(Model Listeners)的更多相关文章

  1. Liferay7 BPM门户开发之37: Liferay7下的OSGi Hook集成开发

    hook开发是Liferay客制扩展的一种方式,比插件灵活,即可以扩展liferay门户,也能对原有特性进行更改,Liferay有许多内置的服务,比如用hook甚至可以覆盖Liferay服务. 可作为 ...

  2. Liferay7 BPM门户开发之34: liferay7对外服务类生成(RestService Get Url)

    在liferay7中开发不依赖Service Builder的对外服务类,非常简洁,只需要2点注解: 在类的前部定义: @ApplicationPath("/PathXXX") 方 ...

  3. Liferay7 BPM门户开发之25: Liferay7应用程序配置(APPLICATION CONFIGURATION)

    首先有几个概念需要明确.1.第一个概念是这里的应用程序配置不是写XML之类的配置文件,是类似字典的类型化配置这意味着应用程序配置不只是一个字符串键值对的列表.值还可以有类型,如整数列表,字符串列表,一 ...

  4. Liferay7 BPM门户开发之24: Liferay7应用程序安全

    整理中...... Resources, Roles, and PermissionsPortal Access Control List (PACL) Custom SSO Providers Au ...

  5. Liferay7 BPM门户开发之1:Liferay7开发环境准备

    liferay sdk下载 \IDE下载 \ Tomcat 安装细节不在此赘述 网上有很多. 只讲核心关键坑点 进入2016年,从Liferay6.2.5 ga6版本开始,到7.0 ga3,在ivy环 ...

  6. Liferay7 BPM门户开发之10: 通用流程实现从Servlet到Portlet(Part1)

    开发目的: 实现通用流程自动化处理(即实现不需要hardcode代码的bpm统一处理后台,仅需要写少量前端html form代码和拖拽设计BPM定义) 既可独立运行或可依托于Liferay或依托其它门 ...

  7. Liferay7 BPM门户开发之17: Portlet 生命周期

    Portlet 生命周期 init() =〉 render() =〉 processAction() =〉 processEvent() =〉 serveResource() =〉destroy() ...

  8. Liferay7 BPM门户开发之12:acitiviti和liferay用户权限体系集成

    写到第12章才出现Liferay的内容,希望可以厚积薄发. 我们的目标是不使用不维护Activiti的用户组织架构,只维护Liferay的体系,这样的好处是非常明显的,即不用做组织架构的同步工作. 原 ...

  9. Liferay7 BPM门户开发之45: 集成Activiti文件上传部署流程BPMN模型

    开发文件上传,部署流程模板. 首先,开发jsp页面,deploy.jsp <%@ include file="/init.jsp" %> <h3>${RET ...

随机推荐

  1. spring cloud 总结

    Finchley版本Spring Cloud Finchley; Spring Boot 2.0.3 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)(Fin ...

  2. iOS app审核被拒申诉

    提交申诉理由之后不需要点击“提交审核”按钮,否则按照重新提交算,需要重新排队,且申诉会不起作用.

  3. ABAP级别【技能树】

  4. Django_Form验证(三)字段,字段的参数,widgets种类

    Form工具是一个很强大的工具,所以他的功能不仅仅是上面2个例子,这里详细记录一下Form的其他功能 字段的一般参数,以CharFields为列子: user=fields.CharField( re ...

  5. 多层josn数据 修改

    var aa = { a: 1, b: { c: 1, d: 1 }, e: [{ f: 1, g: 2 }, { h: 1, i: { j: 3, k: [{ l: 55, m: [1, 2, 3, ...

  6. AngularJS学习笔记(二)

    一.AngularJS Select(选择框) 1.使用 ng-options 创建选择框 <div ng-app="myApp" ng-controller="m ...

  7. gdbserver

    这里写下gdbserver的用法: 两台机子,宿主机A和目标机B. step1: 我们在B上安装gdbserver,在A上编译可执行程序a.out,把a.out拷贝到B上面去. step2: 在A上打 ...

  8. SpringMVC中的Interceptor拦截器及与Filter区别

    SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...

  9. C语言输出格雷码

    格雷码是以n位的二进制来表示数. 与普通的二进制表示不同的是,它要求相邻两个数字只能有1个数位不同. 首尾两个数字也要求只有1位之差. 有很多算法来生成格雷码.以下是较常见的一种: 从编码全0开始生成 ...

  10. springboot项目新功能开发

    在原有的springboot项目上,复制了一个,然后将其中的src下的所有java文件都删除,gradle下把中间件都删除,直流springframework的,重新启动,发现 错误Failed to ...