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);
        }
    }
  • 相关阅读:
    git常用命令
    Laravel框架数据库CURD操作、连贯操作总结
    Laravel 5 系列入门教程(四)【最适合中国人的 Laravel 教程】【完结】
    Laravel 5 系列入门教程(三)【最适合中国人的 Laravel 教程】
    Laravel 5 系列入门教程(二)【最适合中国人的 Laravel 教程】
    Laravel 5 系列入门教程(一)【最适合中国人的 Laravel 教程】
    linux环境下安装nginx步骤
    关于C++中的虚拟继承的一些总结
    C++中拷贝构造函数
    C++之类与对象(3)
  • 原文地址:https://www.cnblogs.com/xyhero/p/9434312.html
Copyright © 2011-2022 走看看