hello world

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

2021-08-21  本文已影响0人  努力学习的lfk

使用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

上一篇下一篇

猜你喜欢

热点阅读