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配置等都没有找到问题。所以转而去测试前、后通知方式。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值