首页 > 其他分享 >Spring-AOP工作流程

Spring-AOP工作流程

时间:2023-03-10 14:12:55浏览次数:29  
标签:增强 对象 Spring 流程 代理 bean AOP 方法

Spring-AOP工作流程

3,AOP工作流程

3.1 AOP工作流程

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

流程1:Spring容器启动

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

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

在这里插入图片描述

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

流程3:初始化bean,

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

  • 注意第1步在容器启动的时候,bean对象还没有被创建成功。

  • 要被实例化bean对象的类中的方法和切入点进行匹配

在这里插入图片描述

  • 匹配失败,创建原始对象,如UserDao
    • 匹配失败说明不需要增强,直接调用原始对象的方法即可。
  • 匹配成功,创建原始对象(目标对象)的代理对象,如:BookDao
    • 匹配成功说明需要对其进行增强
    • 对哪个类做增强,这个类对应的对象就叫做目标对象
    • 因为要对目标对象进行功能增强,而采用的技术是动态代理,所以会为其创建一个代理对象
    • 最终运行的是代理对象的方法,在该方法中会对原始方法进行功能增强

流程4:获取bean执行方法

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

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

为了验证IOC容器中创建的对象和我们刚才所说的结论是否一致,首先先把结论理出来:

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

1.要执行的方法,不被定义的切入点包含,即不要增强,打印当前类的getClass()方法

2.要执行的方法,被定义的切入点包含,即要增强,打印出当前类的getClass()方法

3.观察两次打印的结果

步骤1:修改App类,获取类的类型
public class App {
    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        BookDao bookDao = ctx.getBean(BookDao.class);
        System.out.println(bookDao);
        System.out.println(bookDao.getClass());
    }
}
步骤2:修改MyAdvice类,不增强

因为定义的切入点中,被修改成update1,所以BookDao中的update方法在执行的时候,就不会被增强,

所以容器中的对象应该是目标对象本身。

@Component
@Aspect
public class MyAdvice {
    @Pointcut("execution(void com.itheima.dao.BookDao.update1())")
    private void pt(){}
    
    @Before("pt()")
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}
步骤3:运行程序

在这里插入图片描述

步骤4:修改MyAdvice类,增强

因为定义的切入点中,被修改成update,所以BookDao中的update方法在执行的时候,就会被增强,

所以容器中的对象应该是目标对象的代理对象

@Component
@Aspect
public class MyAdvice {
    @Pointcut("execution(void com.itheima.dao.BookDao.update())")
    private void pt(){}
    
    @Before("pt()")
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}
步骤5:运行程序

在这里插入图片描述

至此对于刚才的结论,我们就得到了验证,这块大家需要注意的是:

不能直接打印对象,从上面两次结果中可以看出,直接打印对象走的是对象的toString方法,不管是不是代理对象打印的结果都是一样的,原因是内部对toString方法进行了重写。

3.2 AOP核心概念

在上面介绍AOP的工作流程中,我们提到了两个核心概念,分别是:

  • 目标对象(Target):原始功能去掉共性功能对应的类产生的对象,这种对象是无法直接完成最终工作的
  • 代理(Proxy):目标对象无法直接完成工作,需要对其进行功能回填,通过原始对象的代理对象实现

上面这两个概念比较抽象,简单来说,

目标对象就是要增强的类[如:BookServiceImpl类]对应的对象,也叫原始对象,不能说它不能运行,只能说它在运行的过程中对于要增强的内容是缺失的。

SpringAOP是在不改变原有设计(代码)的前提下对其进行增强的,它的底层采用的是代理模式实现的,所以要对原始对象进行增强,就需要对原始对象创建代理对象,在代理对象中的方法把通知[如:MyAdvice中的method方法]内容加进去,就实现了增强,这就是我们所说的代理(Proxy)。

标签:增强,对象,Spring,流程,代理,bean,AOP,方法
From: https://www.cnblogs.com/zhangj9/p/17203151.html

相关文章

  • uniapp iOS上架流程
    上架基本需求资料 1、苹果开发者账号注册好的苹果开发者账号,个人的就可以了。缴纳年费99美刀后登录到苹果开发者后台即刻看到如下内容  简单描述一下......
  • IDEA利用maven配置Spring
    写在前面:此篇文章主要是记录IDEA利用maven配置Spring的全过程。由于本人也是慢慢探索出来的,所以有不全或者遗漏的地方,还请大家斧正。请耐心看完文章,前期工作做完后IDEA才可......
  • Spring-AOP简介&案例
    Spring-AOP简介&案例1,AOP简介Spring有两个核心的概念,一个是IOC/DI,一个是AOP。对于AOP,我们前面提过一句话是:AOP是在不改原有代码的前提下对其进行增强。1.1什么是AOP......
  • spring-boot-starter-* 和 *-spring-boot-starter的区别
    spring-boot-starter-*   和    *-spring-boot-starter的区别  答:一个是官方的命名,一个是非官方的命名,非官方的命名一般都是 第三方或者自己 开发的 start......
  • spring学习49-延迟加载
    pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchem......
  • spring学习48-属性注入注入数组和列表的说明
    pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchem......
  • spring学习48-自动装配中定义的bean的作用域
    pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchem......
  • IDEA 启动 Spring Boot 时报错: Command line is too long
    当新拉取的项目启动时,报Errorrunning'MyApplication':Commandlineistoolong.ShortencommandlineforMyApplicationoralsoforSpringBootdefaultconfigur......
  • 总结一下搭建个人网站《曼云古籍在线识别》的完整流程
    继2年前开发出一个标注工具PaddleOCRLabel之后,我就开始炼丹之旅,全面allin人工智能,历时一年,终于炼成了第一颗“丹”——针对于古籍的ocr识别模型。经过400万图片的验证,目前......
  • springboot-整合mysql多数据源配置
    一、springboot+mybatis使用分包方式整合1、application.yml配置文件server:port:8080#启动端口spring:datasource:db1:#数据源1jdbc-url:j......