AOP监听的简单例子
Spring AOP是面向切面的方式,大部分项目使用它都是在事物的处理方面,有关具体的AOP的概念这里就不介绍了,今天我主要通过一个简单的例子让大家来了解AOP的相关应用
?
1.首先看下我项目中service的配置文件
?
?从这个配置文件中,可以看出事物也用到了AOP;如果要要某个方法进行拦截或者监听,就必须加入:<aop:aspectj-autoproxy/> ,然后再下面在配置做AOP处理的类,类似: <bean id="JBPMAspectJ" />;
?
2.AOP处理类:
?
?
package com.berheley.oa.listener.air;import java.util.List;import java.util.Map;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.springframework.web.context.WebApplicationContext;import com.berheley.jbpm.model.CustomTaskInstance;import com.berheley.oa.common.ConstantDefine;import com.berheley.oa.project.business.service.def.workflow.IWorkFlowServiceBO;import com.berheley.oa.project.persistence.model.TUgUser;import com.berheley.util.ApplicationContextKeeper;@Aspectpublic class ProcessEventListener{@Before("execution(* com.berheley.oa.project.business.service.impl.workflow.WorkFlowServiceBO.optBusinessServiceBeforeWFTask*(..))")public void doLogBefore(){}@AfterReturning("execution(* com.berheley.oa.project.business.service.impl.workflow.WorkFlowServiceBO.getTaskInstanceInfo(..))")public void doLogAfter(JoinPoint jp) throws Exception{WebApplicationContext wac = (WebApplicationContext) ApplicationContextKeeper.getAppCtx();IWorkFlowServiceBO workflowBo = (IWorkFlowServiceBO) wac.getBean(ConstantDefine.WORKFLOW_SERVICE);Object[] args = jp.getArgs();// 获得方法的参数// 获得流程的实例CustomTaskInstance taskInstance = (CustomTaskInstance) args[0];// 判断流程是否结束,如果结束不做处理if (taskInstance.getProcessInstance().hasEnded()){} else{// 通过实例获得流程的代办人和流程的idList<Map<String, Object>> list = workflowBo.getAcorIdByTaskInstance(taskInstance);if (list.size() > 0){if (list.get(0).get("userName") != null&& !"".equals(list.get(0).get("userName"))){// 打开流程代办的urlString url = "/workflow/service/doTask.ao?type=message&method=goTask&defaltPage=0&taskInstanceId="+ list.get(0).get("taskId");// 当前流程的代办人的usernameString userName = list.get(0).get("userName").toString();TUgUser user = workflowBo.getUserByUsername(userName);// 取出当前代办人的所有代办流程信息String message = workflowBo.getTaskListReMindForMainPage("120",user);MessagePacking mp = new MessagePacking();String processMessage = mp.packingCurrentProcessMessage(message,list.get(0).get("taskId").toString(), user);// 把取出的流程消息还原成jsonMessageSocketClient ms = new MessageSocketClient();ms.sendMessage(processMessage);}}}}}?通过这段代码,应该可以让大家初步的掌握AOP的使用