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[]{});
- }
- }
Spring Aspect 用法略讲的更多相关文章
- Java Spring AOP用法
Java Spring AOP用法 Spring AOP Java web 环境搭建 Java web 项目搭建 Java Spring IOC用法 spring提供了两个核心功能,一个是IoC(控制 ...
- Java Spring IOC用法
Java Spring IOC用法 Spring IoC 在前两篇文章中,我们讲了java web环境搭建 和 java web项目搭建,现在看下spring ioc在java中的运用,开发工具为In ...
- Spring JdbcTemplate用法整理
Spring JdbcTemplate用法整理: xml: <?xml version="1.0" encoding="UTF-8"?> <b ...
- Spring @Aspect进行类的接口扩展
Spring @Aspect进行类的接口扩展: XML: <?xml version="1.0" encoding="UTF-8"?> <be ...
- Spring @Aspect切面参数传递
Spring @Aspect切面参数传递: Xml: <?xml version="1.0" encoding="UTF-8"?> <bean ...
- Spring @Aspect实现切面编程
参考:http://blog.csdn.net/cdl2008sky/article/details/6268628 参考:http://www.360doc.com/content/12/0602/ ...
- spring RestTemplate用法详解
spring RestTemplate用法详解 spring 3.2.3 框架参考有说明 21.9 Accessing RESTful services on the Client
- 范仁义html+css课程---9、video、audio、canvas和svg元素略讲
范仁义html+css课程---9.video.audio.canvas和svg元素略讲 一.总结 一句话总结: video:HTML5视频标签. audio:html5音频标签. canvas:绘制 ...
- 使用spring aspect控制自定义注解
自定义注解:这里是一个处理异常的注解,当调用方法发生异常时,返回异常信息 /** * ErrorCode: * * @author yangzhenlong * @since 2016/7/21 */ ...
随机推荐
- 国外大师给PHP初学者的8条建议
学习一门新语言可能会是一件很艰巨的任务,最好的办法就是借鉴前辈的经验已达到事半功倍,下面就是为php新手们准备的一些经验餐. 1.从OOP开始Naramore是SourceForge员工以及PHPWo ...
- 在OpenStack虚拟机实例中创建swap分区的一种方法
测试组里一个同学负责MapR的搭建,MapR文档中建议每个节点上至少有24GB的swap分区,不知道MapR为啥会有这种反人类的建议……swap无非就是一块顺序读写的磁盘空间,莫非省着内存不用,用sw ...
- Android消息推送之各种方案的对比
C2DM/GCM: 优点:免费,搭建方便 缺点:依赖谷歌服务器:免费服务有上限:依赖谷歌服务包:需要2.2+版本的安卓系统才支持:对网络状况有一定要求,接收不可靠.(也是基于XMPP协议) XMPP( ...
- Ubuntu下JDK+Tomcat+MySql环境的搭建
主机在阿里云上,所以网络的配置都省了,只剩下软件的安装和配置 1.安装mysql 1.1 apt-get install mysql-server-5.5 安装过程中,有两次提示输入 mysql 的 ...
- poj 2689 Prime Distance(大区间素数)
题目链接:poj 2689 Prime Distance 题意: 给你一个很大的区间(区间差不超过100w),让你找出这个区间的相邻最大和最小的两对素数 题解: 正向去找这个区间的素数会超时,我们考虑 ...
- webpack + vue最佳实践
webpack + vue最佳实践 我的原文地址:http://www.xiaoniuzai.cn/2016/10/04/webpack%20+%20vue%E6%9C%80%E4%BD%B3%E5% ...
- 必须掌握的Linux命令
章节简述: 本章节讲述系统内核.Bash解释器的关系与作用,教给读者如何正确的执行Linux命令以及常见排错方法. 经验丰富的运维人员可以恰当的组合命令与参数,使Linux字符命令更加的灵活且相对减少 ...
- js框架封装,模拟jQuery封装
模拟jQuery框架,利用原生的js技术,封装一个js框架,以加深对jQuery的常用api的使用和面向对象原理的理解:一:结构部分首先利用闭包,构造一个自执行函数,然后利用选择器函数Sizzle,获 ...
- php常量作用
PHP常量的特点是: 1.不能通过外部来传递,也就是不能通过get与post还有cookie等方式来传递赋值,所以可以确定是程序执行过程中定义的,非外界变量.2.定义后不能更改,可以防止被篡改. 基于 ...
- Attempt to write to field 'android.support.v4.app.FragmentManagerImpl android.support.v4.app.Fragment.mFragmentManager' on a null object reference
E/AndroidRuntime﹕ FATAL EXCEPTION: mainProcess: org.example.magnusluca.drawertestapp, PID: 3624java. ...