博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AspectJ学习笔记
阅读量:5952 次
发布时间:2019-06-19

本文共 3605 字,大约阅读时间需要 12 分钟。

  1. 介绍

    1. AspectJ是一个基于Java语言的AOP框架
    2. Spring2.0以后新增了对AspectJ切点表达支持
    3. @AspectJ是AspectJ1.5新增功能,通过JDK5注解技术,允许Bean类中定义切面,新版本Spring框架,建议使用AspectJ方式来开发AOP
    4. 主要用途:自定义开发
  2. 切入点表达式

    1. execution() 用于描述方法

      复制代码
      1. 语法:execution(修饰符 返回值 包.类.方法(参数) throws 异常)

        1. 修饰符:一般省略
        2. 返回值:*(任意)
          1. 省略
            1. con.adolph.cn 固定包
            2. com.adolph. adolph包下面子包任意*
            3. com.adolph.. adolph包下面的所有子包(含自己)
          1. 省略
          2. UserServiceImpl 指定类
          3. *Impl 以Impl结尾
          4. User 以User开头*
          5. *. 任意
        3. 方法名
          1. 不能省略
          2. addUser 固定方法
          3. add 以add开头*
          4. *Do 以Do结尾
          5. *. 任意
        4. 参数
          1. () 无参
          2. (int) 一个整型
          3. (int,int) 两个
          4. (..) 参数任意
        5. throws
          1. 可省略,一般不写
      2. 综合

        `execution(* com.adolph.AOP.jdk.*.*(..))`复制代码
  3. AspectJ通知类型

    1. aop联盟定义通知类型,具有特性接口,必须实现,从而确定方法名称
    2. aspectj 通知类型,只定义类型名称。以及方法格式
    3. 个数:6种,知道5种,掌握一种
      1. before:前置通知
      2. afterReturning:后置通知(应用:常规数据处理)
      3. around:环绕通知(应用:十分强大,可以做任何事情)
        1. 方法执行前后分别执行、可以阻止方法的执行
        2. 必须手动执行目标方法
      4. afterThrowing:抛出异常通知(应用:包装异常信息)
      5. after:最终通知(应用:清理现场)
  4. 基于XML

    1. 目标类:接口+实现

    2. 切面类:编写多个通知,采用aspectJ通知名称任意(方法名任意)

    3. aop编程:将通知应用到目标类

    4. 测试

    5. 目标类

      public class UserServiceImpl {    public void addUser() {        System.out.println("addUser");    }    public void updateUser() {        System.out.println("updateUser");    }    public void deleteUser() {        System.out.println("deleteUser");    }}复制代码
    6. 切面类

      /** * 切面类,含有多个通知 */public class MyAspect {    public void myBefore(JoinPoint joinPoint) {        System.out.println("前置通知" + joinPoint.getSignature().getName()); //获得目标方法名    }    public void myAfterReturning(JoinPoint joinPoint, Object ret) {        System.out.println("后置通知" + joinPoint.getSignature().getName() + "____" + ret); //获得目标方法名    }    public Object myAround(ProceedingJoinPoint joinPoint) throws Throwable{        System.out.println("前");        //手动执行目标方法        Object proceed = joinPoint.proceed();        System.out.println("后");        return proceed;    }    public void MyAfterThrowing(JoinPoint joinPoint,Throwable e){        System.out.println("抛出异常通知:");    }    public void after(JoinPoint joinPoint){        System.out.println("最终");    }}复制代码
    7. xml

      复制代码
  5. 基于注解

    1. 替换bean

      复制代码
      @Componentpublic class MyAspect复制代码
    2. 必须进行aspectj自动代理

      复制代码
    3. 声明切面

      @Component@Aspectpublic class MyAspect复制代码
    4. 设置前置通知

      @Before("execution(* com.adolph.AOP.jdk.UserServiceImpl.*(..))")    public void myBefore(JoinPoint joinPoint) {        System.out.println("前置通知" + joinPoint.getSignature().getName()); //获得目标方法名    }复制代码
    5. 替换公共切入点

      @Pointcut("execution(* com.adolph.AOP.jdk.UserServiceImpl.*(..))")private void myPointCut(){}复制代码
    6. 设置后置通知

      @AfterReturning(value = "myPointCut()",returning = "ret")public void myAfterReturning(JoinPoint joinPoint, Object ret) {    System.out.println("后置通知" + joinPoint.getSignature().getName() + "____" + ret); //获得目标方法名}复制代码
    7. 设置环绕通知

      @Around(value = "myPointCut()")public Object myAround(ProceedingJoinPoint joinPoint) throws Throwable{    System.out.println("前");    //手动执行目标方法    Object proceed = joinPoint.proceed();    System.out.println("后");    return proceed;}复制代码
    8. 设置抛出异常

      @AfterThrowing(value = "myPointCut()",throwing = "e")public void MyAfterThrowing(JoinPoint joinPoint,Throwable e){    System.out.println("抛出异常通知:");}复制代码
    9. 最终通知

      @AfterThrowing(value = "myPointCut()",throwing = "e")public void MyAfterThrowing(JoinPoint joinPoint,Throwable e){    System.out.println("抛出异常通知:");}复制代码

转载于:https://juejin.im/post/5ca23972e51d453c0f7d8e93

你可能感兴趣的文章
Mac下配置PHP+Apache+phpMyAdmin+MySql远程链接
查看>>
sqlserver 批量删除相同前缀名的表
查看>>
ssh-copy-id password
查看>>
【Testin实验室】MoiMark安卓中国终端体验性能排行榜(11月报)
查看>>
Wireshark入门与进阶---数据包捕获与保存的最基本流程
查看>>
讲义笔记
查看>>
Spring中HibernateCallback的用法(转)
查看>>
编译原理——语言处理程序
查看>>
IOS中通知中心(NSNotificationCenter)的使用总结
查看>>
TOP 10开源的推荐系统简介
查看>>
apache开源项目--nutch
查看>>
Oracle12C 怎样导入scott用户
查看>>
jQuery Validate 表单验证插件----在class属性中添加校验规则进行简单的校验
查看>>
Google C++ style guide——命名约定
查看>>
html image -- data:image/png;base64
查看>>
Mybatis bug修正
查看>>
ubuntu(14.04) 下安装yaf拓展
查看>>
C++产生随机数
查看>>
IOS-程序员和设计师必备的20个CSS工具
查看>>
HPU周赛题目解析
查看>>