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 的五种通知的更多相关文章

  1. Spring4.0学习笔记(10) —— Spring AOP

    个人理解: Spring AOP 与Struts 的 Interceptor 拦截器 有着一样的实现原理,即通过动态代理的方式,将目标对象与执行对象结合起来,降低代码之间的耦合度,主要运用了Proxy ...

  2. Spring4.0学习笔记(9) —— Spring泛型依赖注入

    1.定义基础仓库 package com.spring.generic.di; public class BaseRepository<T> { } 2.定义基础服务层 package c ...

  3. Spring 源码学习笔记11——Spring事务

    Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...

  4. spring aop 的五种通知类型

    本文转自:http://blog.csdn.net/cqabl/article/details/46965197 spring aop通知(advice)分成五类: 前置通知[Before advic ...

  5. Spring4.0学习笔记(1) —— 基础知识

    1.基本定义 IOC: 其思想是反转资源获取的方向,传统的资源查找方式要求组件向容器发起请求查找资源,作为回应,容器适时的返回资源,而应用了 IOC之后,容器主动将资源推送给它所管理的组件,组件索要做 ...

  6. spring aop的五种通知类型

    昨天在腾讯课堂看springboot的视频,老师随口提问,尼玛竟然回答错了.特此记录! 问题: Spring web项目如果程序启动时出现异常,调用的是aop中哪类通知? 正确答案是: 异常返回通知. ...

  7. Spring4.0学习笔记(7) —— 通过FactoryBean配置Bean

    1.实现Spring 提供的FactoryBean接口 package com.spring.facoryBean; import org.springframework.beans.factory. ...

  8. Spring4.0学习笔记(6) —— 通过工厂方法配置Bean

    1.静态工厂方法: bean package com.spring.factory; public class Car { public Car(String brand) { this.brand ...

  9. Spring4.0学习笔记(5) —— 管理bean的生命周期

    Spring IOC 容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务 Spring IOC 容器对Bean的生命周期进行管理的过程: 1.通过构造器或工厂方法 ...

随机推荐

  1. 数据结构(线段树):BZOJ 1018: [SHOI2008]堵塞的交通traffic

    1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 2638  Solved: 864 Descri ...

  2. 安装robotframework时提示权限受限

    mba下准备装robotframework,python已默认装好,按照如下的教程继续按照robotframework,发现会提示权限受限,如图. 第二步: 安装 robotframework下载地址 ...

  3. 从大学开始学C++到现在的一些感悟

    Since I choose this road, I will not regret it.     --Mereyct 端午过后的第二天,闲着没事,更新一下博客. 写这个博客的原因是,看到了群里有 ...

  4. XDocument和XmlDocument的区别

    刚开始使用Xml的时候,没有注意到XDocument和XmlDocument的区别,后来发现两者还是有一些不同的. XDocument和XmlDocument都可以用来操作XML文档,XDocumen ...

  5. Appium移动自动化测试(一)--安装Appium(转)

    Appium移动自动化测试(一)--安装Appium 2015-05-30 17:48 by 虫师, 70668 阅读, 13 评论, 收藏, 编辑 Appium 自动化测试是很早之前就想学习和研究的 ...

  6. Selenium终极自动化测试环境搭建(一) Selenium+Eclipse+Junit+TestNG

    Selenium终极自动化测试环境搭建(一)Selenium+Eclipse+Junit+TestNG 第一步 安装JDK JDk1.7. 下载地址:http://www.oracle.com/tec ...

  7. powershel连接数据库监控数据库状态并发报警邮件

    function Get-DatabaseData {    [CmdletBinding()]    param (        [string]$connectionString,        ...

  8. PHP学习之[第07讲]PHP5.4 文件操作函数 之 图片计数器的实例

    1.filetype():输出文件类型: 2.stat():获取文件的基本属性的数组: 3.clearstatcache().is_executable().isDir().idFile().scan ...

  9. android 自定义Toast显示风格

    1.创建一个自己想要显示Toast风格的XML如下代码(toast_xml.xml): <?xml version="1.0" encoding="utf-8&qu ...

  10. Struts2自己定义拦截器实例—登陆权限验证

    版本号:struts2.1.6 此实例实现功能:用户须要指定username登陆,登陆成功进入对应页面运行操作,否则返回到登陆页面进行登陆,当直接訪问操作页面(登陆后才干訪问的页面)时则不同意,须返回 ...