美文网首页hello world
3.4 aspectJ&&cglib-第3章aop面向切面编程

3.4 aspectJ&&cglib-第3章aop面向切面编程

作者: 努力学习的lfk | 来源:发表于2021-08-21 08:19 被阅读0次

    使用aspectJ实现aop基本步骤:

    1.新建maven项目

    选择maven模板

    2.加入依赖
    1)spring依赖

    <!--spring依赖-->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>5.2.5.RELEASE</version>
        </dependency>
    

    2)aspectJ依赖

    <!--aspectJ依赖-->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-aspects</artifactId>
          <version>5.2.5.RELEASE</version>
        </dependency>
    

    3)junit单元测试

    <!--单元测试-->
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.11</version>
          <scope>test</scope>
        </dependency>
    
    添加依赖.png

    3.创建目标类:接口和它的实现类
    要做的事给类中的方法增加功能

    创建接口.png
    创建接口的实现类.png

    4.创建切面类(普通类)
    1)在类的上面加入@Aspect

    在类的上面定义@Aspect

    2)在类中定义方法。
    方法就是切面要执行的功能代码,在方法上面加入aspectJ中的通知注解,例如@Before。有需要只当切入点表达式execution()


    定义切面要执行的功能代码.png
    加入通知注解与切入点表达式.png

    5.创建spring的配置文件:声明对象,把对象交给容器统一管理。对象可以使用注解或xml配置文件<bean>
    1)声明目标对象

    声明目标对象.png

    2)声明切面类对象


    声明切面对象.png

    3)声明aspectJ框架中的自动代理生成器标签
    自动代理生成器:用来完成代理对象的自动创建功能


    声明自动代理生成器.png

    <aop:aspectj-autoproxy/>:会把容器所有对象都找到,然后按照切入点表达式的声明信息,找到目标并生成它的代理。会把容器中所有符合条件的目标都生成代理。

    6.创建测试类
    从spring容器中获取目标对象(实际就是代理对象)。通过代理执行方法,实现aop的功能增强。

    创建测试类

    JoinPointd指定通知方法中的参数(所有通知都可以用)

    作用:可以在通知方法中获取方法执行时的信息,例如方法名称、方法的实参。
    这个JoinPointd参数的值是由框架赋予,必须是第一个位置的参数


    JoinPoint获取方法执行时的信息

    @Before前置通知

    上例使用的就是@Before通知

    @AfterReturning后置通知

      属性:1.value切入点表达式
           2.returning自定义的变量,表示目标方法的返回值
             自定义变量名必须和通知方法的形参名一样
      位置:在方法定义的上面
      特点:1.在目标方法之后执行
           2.能够获取目标方法的返回值,可以根据返回值做不同的处理和功能
           3.可以修改这个返回值
    

    @Around环绕通知(功能最强的通知)

    环绕通知方法的定义格式:
    1.public
    2.必须有一个返回值,推荐使用Object
    3.方法名称自定义
    4.方法有参数,固定的参数ProceedingJoinPoint

    @Around:环绕通知
    属性:value 切入点表达式
    位置:在方法的定义上面
    特点:
    1.功能最强的通知
    2.在目标方法的前和后都能增强功能
    3.控制目标方法是否被调用执行
    4.修改原来的目标方法的执行结果,影响最后的调用结果
    环绕通知,等同于jdk动态代理的InvocationHandler接口
    参数 ProceedingJoinPoint等同于Method,作用:执行目标方法
    返回值:就是目标方法的执行结果,可以被修改

    实现目标方法调用 通过代理对象执行方法 运行结果

    控制目标方法的执行


    不符合条件,目标方法不执行

    修改目标方法的执行结果

    修改结果前,返回值为doFirst.png 修改执行结果后.png

    @AfertThrowring异常通知(了解内容)

    异常通知方法的定义格式
    1.public
    2.没有返回值
    3.方法名称自定义
    4.方法有一个Exception,如果有就是JoinPoint
    
        属性:
            1.value切入点表达式
            2.throwing自定义的变量,表示目标方法抛出的异常对象
              变量名必须和方法的参数名一样
        特点:
            1.在目标方法抛出异常时执行
            2.可以做异常的监控程序,监控目标方法执行时是不是有异常。
              如果有异常,可以发送邮件、短信进行通知
    
    在目标方法抛出异常时执行.png

    @After最终通知(了解内容)

    最终通知方法的定义格式
    1.public
    2.没有返回值
    3.方法名称自定义
    4.方法没有参数,如果有就是JoinPoint
    
    @After:最终通知
       属性:value切入点表达式
       位置:在方法上面
       特点:
            1.总是会执行
            2.在目标方法之后执行
    
    即使抛出异常也会执行

    @Pointcut定义切入点

        @Pointcut:定义管理切入点,如果项目中有多个重复的切入点表达式 ,可使用@Pointcut。
              访问权限:一般是private,因为不需要被外界调用
              属性:value 切入点表达式
              位置:自定义的方法上面
              特点:当使用@Pointcut定义在一个方法上面,此时这个方法的名称
                   就是切入点表达式的别名。其他通知中的value属性就可以使用
                   这个方法名称代替切入点表达式。
    
    切面类中有多个重复的切入点表达式

    使用cglib实现aop:

    无接口时自动使用cglib动态代理

    没有接口spring框架自动使用cglib动态代理.png

    有接口时使用cglib动态代理

    cglib能继承就行

    有接口时使用cglib动态代理.png

    笔记来源:B站动力节点 spring学习视频

    视频链接:https://www.bilibili.com/video/BV1nz4y1d7uy

    相关文章

      网友评论

        本文标题:3.4 aspectJ&&cglib-第3章aop面向切面编程

        本文链接:https://www.haomeiwen.com/subject/bvmjpltx.html