【Spring】AOP工作流程

前言:
AOP(Aspect Oriented Programming)面向切面编程:一种编程范式,指导开发者如何组织程序结构。
AOP作用:在不惊动原始设计的基础上为其进行功能增强。

  • 由于AOP是基于Spring容器管理的bean做的增强,所以整个工作过程需要从Spring加载bean说起:

流程1:Spring容器启动

  • 容器启动就需要去加载bean
  • 需要被增强的类,如:BookServiceImpl
  • 通知类,如:MyAdvice
  • 注意此时bean对象还没有创建成功

流程2:读取所有切面配置中的切入点

在这里插入图片描述

  • 上面这个例子中有两个切入点的配置,但是第一个pt2()并没有被使用,所以不会被读取。

流程3:初始化bean

判定bean对应的类中的方法是否匹配到任意切入点

  • 注意第1步在容器启动的时候,bean对象还没有被创建成功
  • 要被实例化bean对象的类中的方法和切入点进行匹配

在这里插入图片描述
匹配失败,创建原始对象,如UserDao:

  • 匹配失败说明不需要增强,直接调用原始对象的方法即可。

匹配成功,创建原始对象(目标对象)的代理对象,如:BookDao

  • 匹配成功说明需要对其进行增强
  • 对哪个类做增强,这个类对应的对象就叫做目标对象
  • 因为要对目标对象进行功能增强,而采用的技术是动态代理所以会为其创建一个代理对象最终运行的是代理对象的方法,在该方法中会对原始方法进行功能增强

流程4:获取bean执行方法

  • 获取的bean是原始对象时,调用方法并执行,完成操作
  • 获取的bean是代理对象时,根据代理对象的运行模式运行原始方法与增强的内容,完成操作

5、验证容器中是否为代理对象

  • 如果目标对象中的方法会被增强,那么容器中将存入的是目标对象的代理对象
  • 如果目标对象中的方法不被增强,那么容器中将存入的是目标对象本身。

1)、创建一个测试类

package com.itheima;

import com.itheima.config.SpringConfig;
import com.itheima.dao.BookDao;
import com.itheima.dao.UserDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class App {
    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        BookDao bookDao = ctx.getBean(BookDao.class);
        UserDao userDao = ctx.getBean(UserDao.class);
        System.out.println("bookDao :" + bookDao.getClass());
        System.out.println("userDao :" + userDao.getClass());
    }
}

2)、测试结果:

在这里插入图片描述
结论:

  • 由于BookDao类中save()的方法和切入点匹配成功,所以容器中的对象应该是的代理对象。
  • 而UserDao类中save()的方法和切入点匹配失败,所以容器中的对象应该是的原始对象。
  • 45
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值