二:SpringAOP

时间:2025-03-16 19:33:25

一.AOP 面向切面编程思想

横向重复,纵向抽取

以前的案例中: filter中, 动态代理 , interceptor

二.动态代理

1.通过动态代理可以体现aop思想

2.对目标对象中的方法进行增强

三.spring实现aop的原理

  1. 动态代理(优先)

    被代理对象必须要实现接口,才能产生代理对象,如果没有接口将不能使用动态代理技术
  2. cglib代理(没有接口)

    第三方代理技术,cglib代理.可以对任何类生成代理.代理的原理是对目标对象进行继承代理. 如果目标对象被final修饰.那么该类无法被cglib代理.

四.spring aop开发:可以对任何类进行代理增强

spring封装了动态代理代码.不需要手写动态代理代码.封装了cglib代理.

五.spring中名词:

Joinpoint(连接点): 目标对象中,所有可以增强的方法

Pointcut(切入点): 目标对象,已经或需要增强的方法

advice(通知/增强): 需要增强的代码.

weaving(织入): 动词.将通知应用到切点的过程.

target(目标对象): 被代理对象.

proxy(代理对象): 将通知织入到目标对象之后,形成代理对象

aspect(切面): 切入点+通知

六.步骤

  1. 导包

    4+2:核心包+日志包

    2:spring中aop+aspect

    2:spring依赖包:aop联盟+weaving

  2. 准备目标对象

  3. 准备通知类

    前置通知

    后置通知 方法正常结束

    环绕通知

    异常拦截通知

    后置通知 无论如何都执行

  4. 配置文件中配置,导入aop约束

    • 目标对象

    • 通知对象

    • 配置aop:config

      <aop:config>
      <aop:ponint-cut id="切点名称" expression="execution(切点表达式)" />
      <aop:aspect ref="通知对象名称" >
      <aop:before method="" ponintcut-ref="" />
      <aop:after-returning method="" ponintcut-ref="" />
      <aop:around method="" ponintcut-ref="" />
      <aop:after-throwing method="" ponintcut-ref="" />
      <aop:after method="" ponintcut-ref="" />
      </aop:aspect>

七.扩展:使用注解完成aop

  1. 导包

    4+2

    2 aop+aspect

    2 aop联盟+weaving

  2. 准备目标对象

  3. 准备通知类

    前置通知

    后置通知 方法正常结束

    环绕通知

    异常拦截通知

    后置通知 无论如何都执行

  4. 配置文件中配置,导入aop约束

    • 目标对象
    • 通知对象
    • <aop:aspect-autoproxy> 开启注解aop
  5. 注解

    @Aspect 指定当前类是通知类

    @Before 前置通知方法

    @after-returning 后置通知方法

    @around 环绕通知方法

    @after-throwing 异常拦截通知方法

    @after 后通知方法

    @PointCut 抽取切点表达式