zoukankan      html  css  js  c++  java
  • spring面向切面编程示例(xml配置形式vs@注解形式)

    一、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);
        }
    }
  • 相关阅读:
    toj 2819 Travel
    toj 2807 Number Sort
    zoj 2818 Prairie dogs IV
    zoj 1276 Optimal Array Multiplication Sequence
    toj 2802 Tom's Game
    toj 2798 Farey Sequence
    toj 2815 Searching Problem
    toj 2806 Replace Words
    toj 2794 Bus
    css截取字符
  • 原文地址:https://www.cnblogs.com/xyhero/p/9434312.html
Copyright © 2011-2022 走看看