Spring4.0学习笔记(11) —— Spring AspectJ 的五种通知
Spring AspectJ
一、基于注解的方式配置通知
1、额外引入的jar包:
a) com.springsource.org.aopalliance-1.0.0.jar
b) com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
c) spring-aop-4.0.0.RELEASE.jar
d) spring-aspects-4.0.0.RELEASE.jar
2、在xml中加入aop 的命名空间
xmlns:aop="http://www.springframework.org/schema/aop"
//自动为匹配的类生成代理对象
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
3、把横切关注点的代码抽象到切面的类中
a) 切面首先是一个 IOC 的bean,即加入@Component 注解
b) 切面还需要加入@Aspect
4、在类中声明各种通知
a) @before 前置通知 在方法执行之前执行
a.i) AspectJ 表达式 : @Before("execution(*1 com.spring.springaop.*2.*3(...))") //*1 代表 所有类型的返回值;*2 代表 所有的类;*3 代表所有方法
public class LoggingAspect{
public void beforeMethod(JointPoint joinPoint){
String methodName = joinPoint.getSignature().getName();
List<Object> args = Arrays.asList(joinPoint.getArgs());
}
}
b) @After 后置通知 在方法执行之后执行,无论是否发生异常
c) @AfterReturning 返回通知 在方法返回结果之后执行 [在方法正常结束后返回的通知]
c.i) 返回通知是可以访问到方法的返回值的
c.ii) @AfterReturning(value="execution(public int com.spring.springaop.*.*(..))",returning="result")
c.iii) public void afterReturning(JointPoint jointPoint,Object result) {}
d) @AfterThrowing 异常通知 在方法抛出异常之后执行
d.i) @AfterThrowing(value="execution(public int com.spring.springaop.*.*(..))",throwing="ex")
d.ii) public void afterThrowing(JointPoint jointPoint,Exception ex【NullPointerException ex】) {}
d.iii) 可以访问到异常对象,且可以指定在出现特定异常时再执行通知代码【如果是NullPointerException ,则不会在数学计算出现错误时执行,而仅仅会在空指针时才会报异常】
e) @Around 环绕通知 围绕着方法执行
e.i) 环绕通知需要携带ProceedingJointPoint类型的参数
e.ii) 环绕通知类似于动态代理的全过程、 ProceedingJointPoint 类型的参数可以决定是否执行目标方法、且环绕通知必须有返回值,返回值即为
目标方法的返回值
public Object aroundMethod(ProcessdingJoinPoint pjd)
{
Object object = null;
String method = pjd.getSignature().getName(); try {
//前置通知
System.out.println(Arrays.asList(pjd.getArgs()));
//执行目标方法
object = pjd.proceed();
//返回通知
System.out.println(object);
} catch (Exception e) {
//异常通知
System.out.println(e);
}
//后置通知
System.out.println("ends");
return object;
}
5、可以在通知方法中声明一个类型为JointPoint 的参数,就能访问链接细节,如方法名称和参数值
6、优先级 @Order(0) 值越小,越优先
7、重用切点表达式
7.i) 一般情况下不需要插入其他代码,@PointCut 来声明切入点表达式,后面的advisor 直接使用方法来引入当前的切入点表达式
@PointCut("execution(public int com.spring.springaop.*.*(..))")
public void declareJointPointExpression() {}
@Before("declareJointPointExpression()")
public void beforeMethod(){.../}
二、基于xml方式
//配置bean
//配置切面的bean
//配置aop
<aop:config>
//配置切点表达式
<aop:pointcut expression="execution(public int com.spring.springaop.*.*(..)))" id="pointcut"/>
//配置切面及通知
<aop:aspect ref="切面bean的id" order ="2">
<aop:before method="beforeMethod" pointcut-ref="pointcut"></aop:before>
<aop:after method="afterMethod" pointcut-ref="pointcut"></aop:after>
<aop:throwing method="afterThrowing" pointcut-ref="pointcut" throwing="e"></aop:throwing>
<aop:returning method="afterReturning" pointcut-ref="pointcut" returning="result"></aop:returning>
</aop:aspect>
</aop:config>
Spring4.0学习笔记(11) —— Spring AspectJ 的五种通知的更多相关文章
- Spring4.0学习笔记(10) —— Spring AOP
个人理解: Spring AOP 与Struts 的 Interceptor 拦截器 有着一样的实现原理,即通过动态代理的方式,将目标对象与执行对象结合起来,降低代码之间的耦合度,主要运用了Proxy ...
- Spring4.0学习笔记(9) —— Spring泛型依赖注入
1.定义基础仓库 package com.spring.generic.di; public class BaseRepository<T> { } 2.定义基础服务层 package c ...
- Spring 源码学习笔记11——Spring事务
Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...
- spring aop 的五种通知类型
本文转自:http://blog.csdn.net/cqabl/article/details/46965197 spring aop通知(advice)分成五类: 前置通知[Before advic ...
- Spring4.0学习笔记(1) —— 基础知识
1.基本定义 IOC: 其思想是反转资源获取的方向,传统的资源查找方式要求组件向容器发起请求查找资源,作为回应,容器适时的返回资源,而应用了 IOC之后,容器主动将资源推送给它所管理的组件,组件索要做 ...
- spring aop的五种通知类型
昨天在腾讯课堂看springboot的视频,老师随口提问,尼玛竟然回答错了.特此记录! 问题: Spring web项目如果程序启动时出现异常,调用的是aop中哪类通知? 正确答案是: 异常返回通知. ...
- Spring4.0学习笔记(7) —— 通过FactoryBean配置Bean
1.实现Spring 提供的FactoryBean接口 package com.spring.facoryBean; import org.springframework.beans.factory. ...
- Spring4.0学习笔记(6) —— 通过工厂方法配置Bean
1.静态工厂方法: bean package com.spring.factory; public class Car { public Car(String brand) { this.brand ...
- Spring4.0学习笔记(5) —— 管理bean的生命周期
Spring IOC 容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务 Spring IOC 容器对Bean的生命周期进行管理的过程: 1.通过构造器或工厂方法 ...
随机推荐
- 【转】Android的onCreateOptionsMenu()创建菜单Menu详解
原文网址:http://www.linuxidc.com/Linux/2012-02/55500.htm Android一共有三种形式的菜单: 1.选项菜单(optinosMen ...
- 【动态规划】【二分】【最长上升子序列】HDU 5773 The All-purpose Zero
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5773 题目大意: T组数据,n个数(n<=100000),求最长上升子序列长度(0可以替代任何 ...
- QTP自传之对象库编程
对象库编程是我们平时工作中使用最多的编程方式,在自动化脚本开发中起到举足轻重的作用,与描述性性编程相比,更直接和易于维护,今天就和大家简单的聊聊如何进行对象库编程. 既然是对象库编程,肯定要对已存在于 ...
- 《JavaScript语言精髓与编程实践》读书笔记二
第3章非函数式语言特性 这一章首先介绍了语言的分类,命令式(结构化编程,面向对象编程),说明式(函数式等).而这一章,主要介绍JS的非函数式特点. 在开始之前,首先介绍了由“结构化编程”向“面向对象编 ...
- Substrings - HDU 1238(最大共同子串)
题目大意:给你N个串,求出来他们的最大公共子串的长度(子串反过来也算他们的子串). 分析:很久以前就做过这道题,当时是用的strstr做的,不过相同的都是枚举了子串......还是很暴力,希望下次 ...
- Android网络:开发浏览器(一)——基本的浏览网页功能开发
我们定义这个版本为1.0版本. 首先,因为要制作一个浏览器,那么就不能通过调用内置浏览器来实现网页的浏览功能,但是可以使用WebView组件来进行. 在此之前,我们可以来看看两种网页显示方式: ...
- Cocos2d-iphone 为sprite添加双击的事件响应
这篇文章介绍两种方式处理cocos2d中的双击事件响应. 在iOS中使用UITapGestureRecognizer ,很容易就可以添加双击事件处理,但是在cocos2d中无法直接向sprite添加U ...
- git 绑定github
1.创建一个名为git文件夹 2.git init 3.ssh-keygen -t rsa -C "邮箱地址" 4.根据上一步当中默认的文件夹找到id_rsa.pub 复制其中的内 ...
- js~this的陷阱
在JS中,当前对象一般用this表示,在jquery中,当前的对象是用$(this)表示,这些都是最基础的知识,没什么可说的,但我要说的是,当this出现在某个深度时,它的含义你自己要清楚,它是指离当 ...
- Hadoop 的子项目
Hadoop Common: 在0.20及以前的版本中,包含HDFS.MapReduce和其他项目公共内容,从0.21开始HDFS和MapReduce被分离为独立的子项目,其余内容为Hadoop Co ...