『配置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 用法略讲的更多相关文章

  1. Java Spring AOP用法

    Java Spring AOP用法 Spring AOP Java web 环境搭建 Java web 项目搭建 Java Spring IOC用法 spring提供了两个核心功能,一个是IoC(控制 ...

  2. Java Spring IOC用法

    Java Spring IOC用法 Spring IoC 在前两篇文章中,我们讲了java web环境搭建 和 java web项目搭建,现在看下spring ioc在java中的运用,开发工具为In ...

  3. Spring JdbcTemplate用法整理

    Spring JdbcTemplate用法整理: xml: <?xml version="1.0" encoding="UTF-8"?> <b ...

  4. Spring @Aspect进行类的接口扩展

    Spring @Aspect进行类的接口扩展: XML: <?xml version="1.0" encoding="UTF-8"?> <be ...

  5. Spring @Aspect切面参数传递

    Spring @Aspect切面参数传递: Xml: <?xml version="1.0" encoding="UTF-8"?> <bean ...

  6. Spring @Aspect实现切面编程

    参考:http://blog.csdn.net/cdl2008sky/article/details/6268628 参考:http://www.360doc.com/content/12/0602/ ...

  7. spring RestTemplate用法详解

    spring RestTemplate用法详解 spring 3.2.3 框架参考有说明 21.9 Accessing RESTful services on the Client

  8. 范仁义html+css课程---9、video、audio、canvas和svg元素略讲

    范仁义html+css课程---9.video.audio.canvas和svg元素略讲 一.总结 一句话总结: video:HTML5视频标签. audio:html5音频标签. canvas:绘制 ...

  9. 使用spring aspect控制自定义注解

    自定义注解:这里是一个处理异常的注解,当调用方法发生异常时,返回异常信息 /** * ErrorCode: * * @author yangzhenlong * @since 2016/7/21 */ ...

随机推荐

  1. Ubuntu系统中初次下载Android源码的一点经验

    这阵子突然心血来潮,想看看android的源代码,所以这一两天晚上都在折腾下载这个东西. (其实在GitHub上可以在线看的,不过不太喜欢在线看,URL附上 https://github.com/an ...

  2. Spring事务的传播行为 @Transactional(转)

    Spring事务的传播行为 在service类前加上@Transactional,声明这个service所有方法需要事务管理.每一个业务方法开始时都会打开一个事务. Spring默认情况下会对运行期例 ...

  3. Wget 命令详解

    Wget主要用于下载文件,在安装软件时会经常用到,以下对wget做简单说明. 1.下载单个文件:wget http://www.baidu.com.命令会直接在当前目录下载一个index.html的文 ...

  4. Linux编程之UDP SOCKET全攻略

    这篇文章将对linux下udp socket编程重要知识点进行总结,无论是开发人员应知应会的,还是说udp socket的一些偏僻知识点,本文都会讲到.尽可能做到,读了一篇文章之后,大家对udp so ...

  5. 用友金蝶SQL数据库误格式化恢复 SQL数据库修复 SQL数据库恢复 工具 方法

    用友金蝶SQL数据库误格式化恢复 SQL数据库修复 SQL数据库恢复 硬盘误格式化.重分区.重装操作系统覆盖 SQL数据解决方法 [客户名称]:贵州铜仁市开天驾驶人培训中心 [软件名称]:用友T3普及 ...

  6. VSFTP服务——实验

    一.VSFTP 作用:提供文件共享服务,可以应用在互联网中,实现外地登录服务器下载公司文件的功能,不区分客户端,在windows和linux中都是可以使用的 1.安装vsftpd [root@Serv ...

  7. Day1 老男孩python自动化运维课程学习笔记

    2017年1月7日老男孩python自动化运维课程正式开课 第一天学习内容: 上午 1.python语言的基本介绍 python语言是一门解释型的语言,与1989年的圣诞节期间,吉多·范罗苏姆为了在阿 ...

  8. crontab 实现定时脚本执行完毕再执行下一次

    0 4 * * 1 flock -xn /tmp/oneSendTemp.lock -c /home/check_a/h_demand.sh > /dev/null 2>&1

  9. Ubuntu14.04安装wineqq国际版出现无法输入中文的解决方法

    执行命令:sudo vim /usr/bin/wine-qqintl 将"export LANG=zh_CN.utf8"改为"export LANG=en_US.utf8 ...

  10. 第10章 使用MySQL数据库

    1.在数据库中插入数据:INSERT语句: 如://插入一整行: insert into customers values (NULL,'-','-','-'), - ; //插入一行中指定的列内容: ...