Spring(三):aop aspectJ

1、动态代理与AOP

1.1 动态代理

实现方式:

  • jdk动态代理,使用jdk中的Proxy,Method,InvocaitonHanderl创建代理对象。jdk动态代理要求目标类必须实现接口。
  • cglib动态代理:第三方的工具库,创建代理对象,原理是继承。 通过继承目标类,创建子类。子类就是代理对象。 要求目标类不能是final的, 方法也不能是final的。

动态代理的作用:

  • 在目标类源代码不改变的情况下,增加功能。
  • 减少代码的重复
  • 专注业务逻辑代码
  • 解耦合,让你的业务功能和日志,事务非业务功能分离。

1.2 AOP

Aop:面向切面编程, 基于动态代理的,可以使用jdk,cglib两种代理方式。Aop就是动态代理的规范化, 把动态代理的实现步骤,方式都定义好了, 让开发人员用一种统一的方式,使用动态代理。

AOP(Aspect Orient Programming)面向切面编程:

  • Aspect: 切面,给你的目标类增加的功能,就是切面。 像上面用的日志,事务都是切面。 切面的特点: 一般都是非业务方法,独立使用的。
  • Orient:面向, 对着。
  • Programming:编程
    术语:
    1)Aspect:切面,表示增强的功能, 就是一堆代码,完成某个一个功能。非业务功能,常见的切面功能有日志, 事务, 统计信息, 参数检查, 权限验证。
    2)JoinPoint:连接点 ,连接业务方法和切面的位置。
    3)Pointcut : 切入点 ,指多个连接点方法的集合。多个方法
    4)目标对象: 给哪个类的方法增加功能, 这个类就是目标对象
    5)Advice:通知,通知表示切面功能执行的时间。
    一个切面有三个关键的要素:
    1)切面的功能代码,切面干什么
    2)切面的执行位置,使用Pointcut表示切面执行的位置
    3)切面的执行时间,使用Advice表示时间,在目标方法之前,还是目标方法之后。

2、aspectJ

2.1aspectJ简介

aspectJ: 一个开源的专门做aop的框架。spring框架中集成了aspectj框架,通过spring就能使用aspectj的功能。
aspectJ框架实现aop有两种方式:
1.使用xml的配置文件 : 配置全局事务
2.使用注解,我们在项目中要做aop功能,一般都使用注解, aspectj有5个注解。

  • @Before
  • @AfterReturning
  • @Around
  • @AfterThrowing
  • @After

2.2aspectJ实现aop的步骤

1、新建maven项目
2、加入依赖

  • 1)spring依赖
  • 2)aspectj依赖
  • 3)junit单元测试

3、创建目标类:有接口和实现类。要给他增加功能
4、创建切面类:普通类

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

5、创建spring的配置文件:声明对象,把对象交给容器统一管理
声明对象你可以使用注解或者配置文件

  • 1)声明目标对象
  • 2)声明切面类对象
  • 3)声明aspectj框架中的自动代理生成器标签
    自动代理生成器:用来完成代理对象的自动的创建功能的。

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

2.3aspectJ的注解

1、@aspect
作用:表示当前类是切面类
切面类的方法的定义要求:

  • 公共方法public
  • 没有返回值
  • 方法名称自定义
  • 方法可以有参数,也可以没有参数,如果有参数, 参数不是自定义的,有几个参数类型可以使用

2、切入点表达式

  • *:匹配任何数量字符;
  • …:匹配任何数量字符的重复,如在类型模式中匹配任何数量子包;而在方法参数模式中匹配任何数量参数。

3、@Before
前置通知, 在方法执行之前执行。属性:value,是切入点表达式,表示切面的功能执行的位置。
位置:在方法的上面
4、@AfterReturning
后置通知,特点有:

  • 在目标方法之后执行的。
  • 能够获取到目标方法的返回值,可以根据这个返回值做不同的处理的功能。
  • 可以修改返回值

方法对应方法的形参可以有:

  • JoinPoint :封装了SpringAop中切面方法的信息
  • Object :是目标方法执行后的返回值,根据返回值做你的切面的功能处理,自定义变量名必须和通知方法的形参名一样

5、@Arount
环绕通知,属性:value 切入点表达式。
特点:

  • 他是功能最强的通知
  • 他可以在目标方法的前和后都能增强功能
  • 控制目标方法是否被调用执行
  • 修改原来的目标方法的执行结果,影响最后的调用结果

方法参数: ProceedingJoinPoint 等同于Method,作用是执行目标方法的。
方法返回值:目标方法的执行结果,可以被修改。
6、@AfterThrowing
异常通知,属性:

  • value切入点表达式
  • throwing 自定义的变量,表示目标方法抛出的异常对象,变量名必须和方法的参数名一样的

7、 @After
最终通知,属性:value 切入点表达式。
位置:在方法的上面
特点:

  • 总是会执行
  • 在目标的方法后执行

8、 @Pointcut
定义和管理切入点的,如果项目中有多个切入点,表达式是重复的,可以复用的,就可以使用这个。示例代码如下:

// A code block
 @Pointcut(value =  "execution(切入点表达式")
    private void 名称(){

    }
    @注解(value = "名称()")
    public void 切面方法(){
        //代码
    }

猜你喜欢

转载自blog.csdn.net/qq_41984117/article/details/109566915