Spring Aspect 用法略讲

『配置Aspect』
若要启用AspectJ风格的注解则必须额外的导入AspectJ的jar包,此外还需要在spring的配置文件中进行配置,配置方式有两种;

一.在配置文件的Schema中进行配置
第一步:在schema中添加xmlns:aop="http://www.springframework.org/schema.aop"
第二步:在schema中的xsi:schemaLocation中添加两行:http://www.springframework.org/schema/aop以及http://www.springframework.org/schema/aop/spring-aop.xls
第三步:在beans标签体中添加<aop:aspectj-autoproxy/>

二.在beans标签体中添加一个bean
第一步:添加<bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator">
第二步:在beans标签体中添加<aop:aspectj-autoproxy/>

『Aspect使用讲解』
有两种方式,第一种是使用AspectJ风格的注解,第二种是使用XML配置文件

零.预备
execution(modifier returnType classType methodName params throwsType)——切入点指示符
用法讲解
六个参数均支持通配符"*",但methodName还额外支持"(..)"通配符用来匹配一个或者多个参数,六个参数中returnType,methodName,params这三者不能省略,其余均可省略
用法示例
execution(* * (..))——匹配任意返回类型,任意方法名,任意参数的方法,也就是一切方法都可以
execution(public * *Controller get* (*,String))——匹配任意类访问修饰符为public的,任意返回值类型的,属于以Controller结尾的类的,方法名以get开头的,参数一个任意类型一个String类型的方法
execution(* org.xt.controller.*Controller.* (..))——此用法不言而喻

一.使用AspectJ风格的注解,这类注解spring支持的有:
@Aspect——此注解用来将一个类定义成一个切面
用法示例
@Aspect
classModifier class className{}

@Before——此注解是用来标注增强方法,其作用是将增强方法切入连接点中,使其在连接点方法执行之前执行
用法示例
@Aspect
classModifier class className{
    @Before("execution(* org.xt.controller.*.* (..))")
    methodModifier methodReturnType methodName(){}
}

@AfterReturning——此注解是用来标注增强方法,其作用是将增强方法切入连接点中,使其在切入点点方法执行完成成功返回之后执行,它有两个属性分别为pointcut和returning
用法讲解
returning用来指定切入点的返回值对象
用法示例
@Aspect
classModifier class className{
    @AfterReturning(returning="desReturnValue",pointcut="execution(* org.xt.controller.*.* (..))")
    methodModifier methodReturnType methodName(Object desReturnValue){
        //打印返回值对象
        System.out.println(String.valueOf(desReturnValue));
    }
}

@AfterThrowing——此注解是用来标注增强方法,其作用是将增强方法切入连接点中,用来处理切入点方法未处理的异常,它有两个属性分别为pointcut和throwing
用法讲解
throwing用来指定切入点抛出的异常对象
用法示例
@Aspect
classModifier class className{
    @AfterThrowing(throwing="desThrowValue",pointcut="execution(* org.xt.controller.*.* (..))")
    methodModifier methodReturnType methodName(Throwable desThrowValue){
        //打印异常消息
        System.error.println(desThrowValue.getMessage());
    }
}

@After——此注解是用来标注增强方法,其作用是将增强方法切入连接点中,使其在切入点点方法执行之后执行,此标注并不要求切入点方法一定要成功执行完成
用法示例
@Aspect
classModifier class className{
    @After("execution(* org.xt.controller.*.* (..))")
    methodModifier methodReturnType methodName(){}
}

@Around——此注解的功能最是强大,因为其标注的增强方法可以直接干预切入点方法的执行
用法讲解
被此标注的增强方法必须有一个参数,参数类型为ProceedingJoinPoint
用法示例
@Aspect
classModifier class className{
    @Around("execution(* org.xt.controller.*.* (..))")
    methodModifier methodReturnType methodName(ProceedingJoinPoint point){}
}

补充:以上共有5种增强方法的标注,在增强方法中若要访问切入点的一些数据,比如切入点方法的参数,切入点方法所属的类对象,切入点方法的代理类对象以及切入点方法本身的一些数据则需要用到JoinPoint类
用法讲解
第一步:为增强方法定义一个JoinPoint类型的参数(@Around增强的方法就不必了,因为其本身就有一个ProceedingJoinPoint)
第二步:此时可以使用JoinPoint类型的参数对象来分别调用Object[] getArgs()来获取切入点方法的参数,Object getTarget()来获取切入点方法的类对象,Object getThis()来获取切入点方法的代理类对象,Signature getSignature()来获取切入点方法的本身信息
用法示例

@Aspect
classModifier class className{
    @Before("execution(protected * org.xt.controller.*.*(..))")
    methodModifier methodReturnType methodName(JoinPoint point){
        Object[] args=point.getArgs();
        for(Object arg:args){
            System.out.println(String.valueOf(arg));
        }
    }

    @AfterReturning(returning="",pointcut="execution(protected * org.xt.controller.*Controller.*(..))")
    methodModifier methodReturnType methodName(JoinPoint point){
        Object target=point.getTarget();
        //打印切入点方法的对象
        System.out.println("切入点方法的类对象为"+target.toString());
    }

    @AfterThrowing(throwing="",pointcut="execution(* org.xt.controller.*.* (*,String,Object))")
    methodModifier methodReturnType methodName(JoinPoint point){
        Object[] args=point.getArgs();
        for(Object arg:args){
            System.out.println(String.valueOf(arg));
        }
    }

    @After("execution(* org.xt.controller.*.* (..))")
    methodModifier methodReturnType methodName(JoinPoint point)){
        //打印切入点方法的方法名
        System.out.println("切入点方法的方法名为"+point.getSignature().getName());
    }

    @Around("execution(* org.xt.controller.*.* (..))")
    methodModifier methodReturnType methodName(ProceedingJoinPoint point){
        Object proxy=point.getThis();
        System.out.println("切入点方法的代理对象为"+proxy.toString());
        //执行切入点函数,可以改变切入点函数的参数
        Object returnValue=point.proceed(new String[]{});
    }
}
时间: 2024-11-07 09:35:12

Spring Aspect 用法略讲的相关文章

Spring AOP用法详解

什么是AOP AOP:Aspect Oriented Programming,中文翻译为"面向切面编程".面向切面编程是一种编程范式,它作为OOP面向对象编程的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理.权限控制.缓存控制.日志打印等等.AOP采取横向抽取机制,取代了传统纵向继承体系的重复性代码 AOP把软件的功能模块分为两个部分:核心关注点和横切关注点.业务处理的主要功能为核心关注点,而非核心.需要拓展的功能为横切关注点.AOP的作用在于分离系统中的各种关注点,

Java Spring AOP用法

Spring AOP Java web 环境搭建 Java web 项目搭建 Java Spring IOC用法 spring提供了两个核心功能,一个是IoC(控制反转),另外一个便是Aop(面向切面编程),IoC有助于应用对象之间的解耦,AOP则可以实现横切关注点(如日志.安全.缓存和事务管理)与他们所影响的对象之间的解耦. 1.简介 AOP主要包含了通知.切点和连接点等术语,介绍如下 通知(Advice) 通知定义了切面是什么以及何时调用,何时调用包含以下几种 Before 在方法被调用之前

Spring Aspect Oriented Programming

Spring Aspect Oriented ProgrammingSpring Aspect Oriented ProgrammingSpring Aspect Oriented ProgrammingSpring Aspect Oriented ProgrammingSpring Aspect Oriented ProgrammingSpring Aspect Oriented Programming http://www.djkk.com/blog/yvbf3319 http://www.

宗镜录略讲——南怀瑾老师——系列6

性相近,习相远 接下来讲“三乘五性”,三乘即声闻.缘觉.菩萨,人的禀赋根性不同,也就是现代心理学所说,人的性向问题.各个性向不同,这还只是人世间的心理研究,不如佛学深,比如苏东坡的诗:“书到今生读已迟”,人的聪明智慧不是靠这一生,是前生累积来的.有些学生爱玩小乘道——有为法.这是他的根性,要想把他转过来,很难,那要花很大的力气.人的禀赋根性为什么不同呢?从佛学观念讲,人有了贪欲这一念,就变成生命在六道轮回中越滚越迷.“轮回”这两字翻译得好极了,当时翻译得很新颖,只是一千多年来用旧了.<易经>上

Spring @Aspect实现切面编程

参考:http://blog.csdn.net/cdl2008sky/article/details/6268628 Spring @Aspect实现切面编程: XML: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springf

宗镜录略讲——南怀瑾老师——系列8

即此用 离此用 <宗镜录>谈到道体,它的自性根本是离开你,不是你离开它.换句话说大家要求空,一般人打坐都想空念头,很多人问我怎么空?唉!我说“天下本无事,庸人自扰之”,是念头来空你,不是你空它.“根本性离”是自性离开你,不是你离开它.比方我们八点钟坐在这里,大家检查第一次的念头.思想现在还有没有?它早就跑掉了!你想空它干嘛!“根本性离”是它离开你,空是它来空你,不是你空它啊!佛法叫你认到自性空,是认清根本性离你,不是你在离它.也就是<楞严经>所说的:“即一切相,离一切法”,两句话说

宗镜录略讲——南怀瑾老师——系列7

第三章 如幻似真情何堪 现在讲到形而上道体的问题,也就是我们平常所讲的“明心见性”.什么叫如来本性?——一切众生自己的本性. 若欲穷微洞本,究旨通宗,则根本性离,毕竟寂灭,绝升沉之异,无缚脱之殊. 最高的道体是什么样子?是“根本性离,毕竟寂灭”.寂灭是中国文字,梵文原意是涅槃之意,用中文翻译叫寂灭,另有一种翻译是圆寂,圆满的寂灭.这些翻译是不是完全是涅槃的本意呢?不是的,因为翻成寂灭与圆寂,在中国文化,尤其在佛学观点上,形成一个很大的误解,好像寂灭.圆寂是死的东西,什么都没有了.一般人学佛,认为

宗镜录略讲——南怀瑾老师——系列4

一切众生.一切佛的本性,就是一切万物的本体,本来是清净.圆明的,以中国文化来讲是“本善”的.不要把它作普通善恶的善来看,它是超越此相对待的善,是至善的,那为什么会动妄念?为什么会有世界?为什么会有万象差别的不同? 佛法的形上学可与<易经>合参 永明寿禅师以<楞严经>要旨答:“最初不觉,忽起动心.”觉与不觉两个问题来了.“不觉”之来,主要是“觉明为咎”.以<易经>的道理来讲,阳极则阴生,阴极则阳生.有人提出来,认为这个答案不够透彻,不能令人满意.这提得很对,是不大令人满意

Spring JdbcTemplate用法整理

Spring JdbcTemplate用法整理: xml: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www