当前位置: 首页 > news >正文

Spring——AOP工作流程

AOP就是代理模式的开发简化

1.Spring容器启动

因为AOP是要将通知类作为一个bean对象交给spring进行管理的,还有经过通知类被增强的类。

此时还没有创建bean对象

2.读取所有切面配置中的切入点

在下面这段代码中,定义了两个切入点,但是只有一个被使用了,只会读取被使用的那个。

@Component
@Aspect
public class MyAdvice {@Pointcut("execution(void org.example.dao.BookDao.save())")public void ptx(){}@Pointcut("execution(void org.example.dao.BookDao.update())")public void pt(){}@Before("pt()")public void method(){System.out.println(System.currentTimeMillis());}
}

3.初始化bean,判定bean对应类中的方法是否匹配到任意切入点

 这里的匹配是指一个即将被创建bean对象的类身上是否有一个方法是需要被增强的,比如说下图的这个BookDaoImpl有一个@Repository注解,所以它会原本被创建一个bean对象交给spring管理。但是现在这个类中的update()方法已经在通知类当中作为了一个切入点

 匹配失败的话,就创建一个原始对象

匹配成功的话,会创建原始对象(目标对象)的代理对象,在上面也就是BookDao的代理对象

       匹配成功说明有切入点需要进行增强,此时会运行代理对象的方法,也就是原始方法的增强版本。这里采用的技术是动态代理。代理就可以做到增强。

spring的AOP内部就是使用代理进行实现的。

4.获取bean执行方法

        获取bean,调用方法并执行,完成操作

        获取的bean是代理对象时,会根据代理对象的运行模式运行原始方法与被增强的内容来完成操作。

5.查看容器中的对象是不是一个代理对象

getclass():获取对象的运行时对象的类

使用下列输出语句

      当一个目标对象的方法没有被增强的时候,输出如下,此时的bean对象就是原始对象。

 当一个目标对象的方法被增强以后,输出如下,此时的bean对象就是原始对象的代理对象

 

 

http://www.lryc.cn/news/38633.html

相关文章:

  • c++11多线程之condition_variable、wait()、notify_one()、notify_all()的使用。
  • skywalking扩展实现 —— 监控数据的动态上报
  • 【GoF 23】23种设计模式与OOP七大原则概述
  • Java 日期时间
  • Face Forgery Suvery
  • 案例学习--016 消息队列作用和意义
  • 【MySQL】MySQL的锁机制
  • HTML 背景
  • Lombok
  • Koa源码学习
  • 一种延迟加载自定义元素的方法
  • Pytho经典面试题荟萃:第一期
  • 01背包问题(大彻大悟版)
  • 【麒麟服务器操作系统忘记开机密码怎么办?---银河麒麟服务器操作系统更改用户密码】
  • 华为OD机试(20222023)考点分类
  • 初级篇 3 - HTML 或 CSS 文件中不懂的标签属性详解
  • 【C语言】每日刷题 —— 牛客语法篇(4)
  • HashMap ConcurrentHashMap介绍
  • C++语法规则3(C++面向对象)
  • Python tkinter 如何实现网站下载工具?将所有数据一键获取
  • 第六章:C语言数据结构与算法初阶之栈
  • Android学习之WebView
  • 3/11 考试总结
  • Leetcode 141.环形链表 142环形链表II
  • hibernate学习(五)
  • STM32CubeIDE 快速开发入门指南
  • 华为OD机试 - 火星文计算(C 语言解题)【独家】
  • 超超超超保姆式详解——字符函数和字符串函数(学不会打我)上
  • Data mesh 笔记
  • (八十三)大白话透彻研究通过explain命令得到的SQL执行计划(2)