`

AOP监听的简单例子

    博客分类:
  • java
阅读更多

Spring AOP是面向切面的方式,大部分项目使用它都是在事物的处理方面,有关具体的AOP的概念这里就不介绍了,今天我主要通过一个简单的例子让大家来了解AOP的相关应用

 

1.首先看下我项目中service的配置文件

 

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
		http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd ">

	
	<!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"
		p:sessionFactory-ref="sessionFactory" />

	
	<!-- the transactional advice (what 'happens'; see the <aop:advisor/> bean below) -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<!-- the transactional semantics... -->
		<tx:attributes>
  		   <!-- methods starting with 'save', 'update' or 'remove' use the default transaction settings -->  
            <tx:method name="opt*"     isolation="DEFAULT" propagation="REQUIRED" rollback-for="BusinessException"/>
			<tx:method name="save*"     isolation="DEFAULT" propagation="REQUIRED" rollback-for="BusinessException"/>    
			<tx:method name="create*"     isolation="DEFAULT" propagation="REQUIRED" rollback-for="BusinessException"/>    
			<tx:method name="update*"     isolation="DEFAULT" propagation="REQUIRED" rollback-for="BusinessException"/>
			<tx:method name="delete*"     isolation="DEFAULT" propagation="REQUIRED" rollback-for="BusinessException"/>
			<tx:method name="insert*"     isolation="DEFAULT" propagation="REQUIRED" rollback-for="BusinessException"/>
            <!-- other methods are set to read only   
            <tx:method name="*" read-only="true"/> -->
		</tx:attributes>
	</tx:advice>
	
	<!-- ensure that the above transactional advice runs for any execution
	of an operation defined by the FooService interface -->
	<aop:config>
		<aop:advisor pointcut="@within(com.berheley.aop.Dbaop)"   advice-ref="txAdvice" />
		<aop:advisor pointcut="execution(* com.berheley.oa.project.business.service.impl..*(..))"   advice-ref="txAdvice" />
		<aop:advisor pointcut="execution(* com.berheley.oa.project.desktop.module.DtModuleBO.*(..))"   advice-ref="txAdvice" />
		<aop:advisor pointcut="execution(* com.berheley.oa.project.desktop.layout.DtLayoutBO.*(..))"   advice-ref="txAdvice" />
		<aop:advisor pointcut="execution(* com.berheley.oa.project.desktop.SetLayOutBo.*(..))"   advice-ref="txAdvice" />
		<aop:advisor pointcut="execution(* com.berheley.oa.project.remind.RemindBO.*(..))"   advice-ref="txAdvice" />
	</aop:config>
	
	<!-- 此句使aspectj可用,必需加入  -->
   <aop:aspectj-autoproxy/> 
   <!-- 此句声明Aspect类,Spring会根据里面的定义对相关类作AOP处理 -->
   <bean id="JBPMAspectJ" class="com.berheley.jbpm.plugin.JBPMAspectJ" />
	<bean id="ProcessEventListener" class="com.berheley.oa.listener.air.ProcessEventListener" />
   <!-- 业务类 -->

	<bean id="commonService"   class="com.berheley.oa.project.business.service.impl.CommonBO">
		<property name="dao">
			<ref bean="commonDao"/>
		</property>
		<property name="scheduler" ref="schedulerFactory" />
	</bean>
	
           
</beans>

 从这个配置文件中,可以看出事物也用到了AOP;如果要要某个方法进行拦截或者监听,就必须加入:<aop:aspectj-autoproxy/> ,然后再下面在配置做AOP处理的类,类似: <bean id="JBPMAspectJ" class="com.berheley.jbpm.plugin.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;

@Aspect
public 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
		{
			// 通过实例获得流程的代办人和流程的id
			List<Map<String, Object>> list = workflowBo.getAcorIdByTaskInstance(taskInstance);
			if (list.size() > 0)
			{
				if (list.get(0).get("userName") != null
							&& !"".equals(list.get(0).get("userName")))
				{
					// 打开流程代办的url
					String url = "/workflow/service/doTask.ao?type=message&method=goTask&defaltPage=0&taskInstanceId="
								+ list.get(0).get("taskId");
					// 当前流程的代办人的username
					String 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);
					// 把取出的流程消息还原成json
					MessageSocketClient ms = new MessageSocketClient();
					ms.sendMessage(processMessage);
				}
			}
		}
	}
}

 通过这段代码,应该可以让大家初步的掌握AOP的使用

分享到:
评论

相关推荐

    Spring AOP+ehCache简单缓存系统解决方案

    在本篇【Spring AOP+ehCache简单缓存系统解决方案】中,我们将探讨如何利用Spring AOP(面向切面编程)和ehCache框架来构建一个高效、简单的缓存系统,以提升应用程序的性能。ehCache是一款流行的开源Java缓存库,它...

    MyAOP(AOP拓展实现小例子).zip

    本文将深入探讨如何在Unity中实现AOP,并基于"MyAOP(AOP拓展实现小例子).zip"的项目进行解析。 首先,我们需要理解Unity中的AOP基础。Unity本身并不内置对AOP的支持,但我们可以通过引入第三方库或自定义解决方案来...

    SpringBoot使用AOP注解记录操作日志

    总结起来,Spring Boot结合AOP和事件监听机制,可以有效地实现操作日志的记录,同时保持代码的清晰和模块化。这不仅有助于调试和问题定位,也能提高系统的可维护性。通过扩展和定制这些组件,我们可以根据项目需求...

    第四章:Spring AOP API 设计模式1

    13. **观察者模式(Observer)**:Spring AOP并没有直接实现观察者模式,但在Spring事件模型中,`ApplicationEventPublisher`和`ApplicationListener`接口体现了观察者模式,允许对象注册监听并响应特定事件。...

    Spring框架核心Jar和AOP所需的Jar文件

    - `spring-context.jar`:扩展了`spring-core`和`spring-beans`,提供了一个上下文环境,支持国际化、事件监听、任务调度、邮件服务等功能。 - `spring-aop.jar`:包含了Spring的AOP支持,允许你在不修改源代码的...

    spring的监听器和缓存.docx

    虽然这部分没有直接涉及到缓存,但这种枚举在实现AOP(面向切面编程)时非常有用,例如,我们可以创建一个切面来拦截带有`OperationLog`注解的方法,并根据`OperateType`的值执行相应的日志记录逻辑。 在Spring ...

    关于Spring的spring-beans-xsd和tx-xsd aop-xsd等

    此外,它还支持消息源、AOP代理、事件监听等特性。 3. **spring-aop-3.0.xsd**:Spring的AOP(面向切面编程)模块提供了在不修改代码的情况下添加额外行为的能力。这个XSD文件定义了如`&lt;aop:config&gt;`、`&lt;aop:...

    ssh2简单实例

    SSH2,全称为Struts2、Spring和Hibernate的第二代集成框架,是Java Web开发中的...通过这个简单的实例,你可以学习到如何利用SSH2搭建一个基础的Java Web应用,并逐步深入理解每个组件的作用和它们之间的协同工作方式。

    spring-aop-3.0.xsd spring-beans-3.0 spring-context-3.0.xsd spring-mvc-3.1.xsd

    `spring-context-3.0.xsd` 文件包含了在上下文环境中配置的各种元素,如消息源、事件监听器、AOP 配置、bean 的工厂方法等。这个文件对于实现高度自定义的 Spring 应用程序非常重要。 4. **spring-mvc-3.1.xsd**: ...

    Redis_Spring_AOP完善.zip

    总结来说,"Redis_Spring_AOP完善.zip"项目是一个学习和实践的好例子,它展示了如何利用SpringBoot的便利性,通过AOP实现数据的Redis缓存,提高系统的响应速度和并发处理能力。通过深入理解并实践这些技术,开发者...

    CXF Spring Hello简单实例

    【标题】"CXF Spring Hello简单实例"是一个关于使用Apache CXF与Spring框架结合实现一个基本的RESTful服务的教程。Apache CXF是一个开源服务框架,它允许开发人员创建和消费各种Web服务,包括SOAP和RESTful风格。...

    Osworkflow 入门级例子

    例如,通过Spring的AOP(面向切面编程)可以自动处理任务的生命周期,而Hibernate则可以用于存储流程实例和历史数据。 总结一下,Osworkflow2.8 工作流是一个强大而灵活的工具,它简化了业务流程的管理,让开发者...

    一个简单的ssh整合的实例

    在这个简单的SSH整合实例中,我们将使用数据库SQL Server作为数据存储,而开发工具选择的是NetBeans。 首先,Spring框架是核心的依赖注入(DI)和面向切面编程(AOP)容器,它提供了管理应用对象和处理事务的能力。...

    反射,监听,拦截问题

    综上所述,这个例子展示了如何在Java中使用反射创建动态代理,利用监听器响应用户交互,以及使用拦截器增强方法调用。通过这些技术,开发者可以更加灵活地控制程序行为,增加功能,同时保持代码的清晰和解耦。然而,...

    基于SSH的AJAX简单实例

    在这个"基于SSH的AJAX简单实例"中,我们将探讨如何将SSH框架与AJAX结合,以实现更加动态和交互式的Web应用。 1. **SSH框架介绍**: - **Spring**:Spring是一个全面的Java企业级应用开发框架,提供了依赖注入、...

    基于Eclipse开发OSGI的简单实例

    **基于Eclipse开发OSGI的简单实例** OSGi(Open Services Gateway Initiative)是一种Java模块化系统,它允许在单个JVM上动态地部署、管理、发现和使用服务。Eclipse是一个广泛使用的开源集成开发环境(IDE),它...

    Spring整合ActiveMQ简单实例

    **Spring 整合 ActiveMQ 简单实例** 在当今的分布式系统中,消息队列(Message Queue)作为异步处理、解耦组件的关键技术,被广泛应用。Spring 框架与 ActiveMQ 的整合,使得开发者能够轻松地在 Spring 应用程序中...

    jms+activeMq+spring学习简单例子

    标题“jms+activeMq+spring学习简单例子”表明这个压缩包包含了一些示例代码,用于演示如何在Spring框架中集成JMS和ActiveMQ,以便于理解和学习。通过这个例子,开发者可以了解如何在实际应用中实现基于消息的通信。...

    超简单的SpringMVC实例

    2. **配置web.xml**:设置DispatcherServlet,并添加SpringMVC的监听器ContextLoaderListener,以初始化Spring的IoC容器。 3. **配置spring-servlet.xml**:在SpringMVC配置文件中,我们需要定义HandlerMapping、...

Global site tag (gtag.js) - Google Analytics