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 */ ...
随机推荐
- android 常用资料
网上收集保存的一些常用的android资料,写得都比较不错,和大家分享下,共同学习: _ android ListView美化.docx androidshape.docx android_textv ...
- 用curl自动登录HTTPS站点
前文http://blog.csdn.net/sheismylife/article/details/9237925 演示了如何手动的通过运行curl命令登录HTTPS站点,然后获取cookie, 再 ...
- java获取登陆用户的IP地址
/** * 通过HttpServletRequest返回IP地址 * @param request HttpServletRequest * @return ip String * @throws E ...
- linux ftp安装和配置
1. 启动VSFTP服务器 A:cenos下运行:yum install vsftpd B. 登录Linux主机后,运行命令:"service vsftpd start"C. ...
- DW,DM,ODS的区别
数据仓库的重要应用是将不同来源的数据和异构数据通过ETL整合在一起,为决策分析提供支撑,若在同一个数据库中分不同用户,此意义不大:假设所有有用户都在一个数据库里,如果因为某个原因数据库重启,那么会影响 ...
- ng1 http 读取json数据
在前端开发过程中,有时后端还没开发出接口,需要经常自己构造获取本地mock数据. AngularJS XMLHttpRequest $http 是 AngularJS 中的一个核心服务,用于读取远程服 ...
- Ubuntu16.04删除客人会话
1.按下 Ctrl+Alt+T - 打开终端 2.输入以下指令: sudo gedit /etc/lightdm/lightdm.conf 3.源代码之后添加如下代码,然后保存.关闭,重启电脑即可. ...
- vue 2.0 无法编译ES6语法
# vue2.0 webpack 无法编译 ES6 语法 之前在使用 vue 1.x 时用 vue-loader@8.0.0 版本可以正常打包vue的代码,包括ES6语法也能正常转为ES5语法,但是当 ...
- laravel 添加第三方扩展库
确定需要安装的位置 common.php测试代码 打开cmd 跳转到项目根目录下运行命令 composer install 打开文件 vender/composer/autoload_classmap ...
- moodle其他搜集
1.将面包屑的符号换成">>",找到皮肤包里的config.php文件,在最后加入 $THEME->rarrow=">>"; ...