一、xml配置形式
1、在Spring配置文件中增加面向切面配置
当调用com.activemq.service.impl.ConsumerServiceImpl接口实现类的任意方法时执行切面类中的方法。
2、写切面类
注意:
1)不能对web层(比如:com.activemq.action.ConsumerController)做代理插入操作,亲测无效。
(之前认为对web层进行切面处理无效,其实不是,无效的原因在于切面配置所在的文件,如果是spring-mvc.xml(Springmvc的配置文件)中,就有效,如果在applicationContext.xml(Spring的配置文件)中,就无效。)
2)<aop:pointcut>如果位于<aop:aspect>元素中,则命名切点只能被当前<aop:aspect>内定义的元素访问到。为了能被整个<aop:config>元素中定义的所有增强访问,则必须在<aop:config>下定义切点。
二、@Aspect注解形式
1、配置
在spring配置文件applicationContext.xml中启用@Aspect,并声明通知类
<!-- 声明通知类 --> <bean id="aspectBean" class="icom.axx.action.AopAspect" /> <!-- 启用spring对AspectJ注解的支持 --> <aop:aspectj-autoproxy />
2、写通知类
package icom.axx.action; import java.util.HashMap; import java.util.Map; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.beans.factory.annotation.Autowired; import icom.axx.dao.AopAspectDao; /** * 面向切面类 * 用于保存干线巡检手机端调用接口的信息。 * @author wangxiangyu * */ @Aspect public class AopAspect { @Autowired AopAspectDao aopAspectDao; public static final String EDP = "execution(* icom.axx.service.impl.*..*(..))"; /** * 前置通知:目标分方法调用之前执行 */ @Before(EDP) public void doBefore(JoinPoint jp){ } /** * 最终通知: * 目标方法调用之后执行(无论目标方法是否出现异常均执行) */ @After(EDP) public void doAfter(JoinPoint jp){ //获取类名 String className = jp.getTarget().getClass().getName(); //调用的方法名 String methodName = jp.getSignature().getName(); //调用方法的参数 Object[] argArr = jp.getArgs(); String arg = ""; if(null != argArr && argArr.length>0) { for(Object argObj : argArr) { arg += argObj.toString(); } } //若传递参数大于300字符,只截取前300个字符。 if(arg.length()>300) { arg = arg.substring(0, 300); } Map<String, String> param = new HashMap<String, String>(); param.put("className", className); param.put("methodName", methodName); param.put("param_list", arg); //插入tb_base_mobile_gxxj_record aopAspectDao.saveInvokeInfo(param); } }