首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

spring的AOP调用(3)环绕通知完整实现代码

2012-11-08 
spring的AOP调用(三)环绕通知完整实现代码spring的AOP调用(三)环绕通知完整实现代码采用aop:config配置环

spring的AOP调用(三)环绕通知完整实现代码
spring的AOP调用(三)环绕通知完整实现代码

采用aop:config配置环绕通知来实现AOP处理,在DEMO项目中表现良好。

核心配置文件如下:
<aop:config>
<aop:aspect ref="managerAOP">
   <aop:pointcut id="theExecutionOfBizOrderSaveMethod"
    expression="execution(*
com.sillycat..*.dao.*DAO.save*(..)) and args(obj)" />
   <aop:around pointcut-ref="theExecutionOfBizOrderSaveMethod"
    method="save" />
</aop:aspect>
</aop:config>
<aop:config>
<aop:aspect ref="managerAOP">
   <aop:pointcut id="theExecutionOfBizOrderDeleteMethod"
expression="execution(* com.sillycat..*.dao.*DAO.delete*(..)) and args(obj)" />
   <aop:around pointcut-ref="theExecutionOfBizOrderDeleteMethod"
    method="delete" />
</aop:aspect>
</aop:config>
核心类ManagerAOPImpl.java如下:
package com.sillycat.easyaop.service.aop;
import javax.annotation.Resource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.stereotype.Service;
import com.sillycat.easyaop.dao.RoleDAO;
import com.sillycat.easyaop.model.Role;
@Service("managerAOP")
public class ManagerAOPImpl {
private static Log log = LogFactory.getLog(ManagerAOPImpl.class);
private static final String BASE_MANAGER_SAVE = "com.sillycat.easyaop.dao.impl.RoleDAOImpl";
private RoleDAO roleDAO;
@Resource(name = "roleDAO")
public void setRoleDAO(RoleDAO roleDAO) {
   this.roleDAO = roleDAO;
}
public void delete(ProceedingJoinPoint call, Object obj) {
   log.debug("target name is : " + call.getTarget());
   log.debug("args is : " + obj);
   try {
    call.proceed();
   } catch (Throwable e) {
    log.error(e);
    throw new RuntimeException(e);
   } finally {
    if (checkIfNeedProccess(call, obj)) {
     log.debug("object is extends User,begin to ivoke roleDAO!");
     roleDAO.delete((Role) obj);
    }
   }
}
public void save(ProceedingJoinPoint call, Object obj) {
   log.debug("target name is : " + call.getTarget());
   log.debug("args is : " + obj);
   if (checkIfNeedProccess(call, obj)) {
    log.debug("object is extends User,begin to ivoke roleDAO!");
    roleDAO.save((Role) obj);
   }
   try {
    call.proceed();
   } catch (Throwable e) {
    log.error(e);
    throw new RuntimeException(e);
   }
}
private boolean checkIfNeedProccess(ProceedingJoinPoint call, Object obj) {
   boolean flag = false;
   if (!BASE_MANAGER_SAVE.equalsIgnoreCase(getCompleteTargetName(call
     .getTarget()))
     && (obj instanceof Role)) {
    flag = true;
   }
   return flag;
}
private String getCompleteTargetName(Object target) {
   String className = "";
   if (target != null) {
    className = target.toString();
    int loc = className.indexOf("@");
    if (loc >= 0) {
     className = className.substring(0, loc);
    }
   }
   return className;
}
}
以上方式在DEMO项目中,在公司的正式项目的单元测试中都表现正确,但是启动WEB容器后发现,AOP拦截了3次,查找项目的多余JAR包冲突,WEB.XML配置,SCCL-SERVLET.XML配置等都没有找到问题。所以转而去测试前、后通知方式。

热点排行