博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring5源码精讲(九):AOP源码篇#1:切面、切点、通知及基本概念
阅读量:2066 次
发布时间:2019-04-29

本文共 1847 字,大约阅读时间需要 6 分钟。

目录

1、前言

IOC篇源码剖析结束(虽然有点烂尾,但这并不影响我们开启AOP源码的剖析)。

AOP的流程大概可以分为三个部分:

1、切面解析

2、代理对象创建
3、目标方法调用与通知

在开始AOP源码的剖析之前,我们需要先做一个前置知识的铺垫。

2、基本概念

关于AOP的几个术语,我们还是需要了解一下的。

但是直接看概念很容易傻眼,不信的话你试试-------------

  • 横切关注点(对哪些方法进行切入)

    对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点
  • 切面

    类是对物体特征的抽象,切面就是对横切关注点的抽象
  • 连接点(joinpoint)(需要切入的点)

    被拦截到的点,因为Spring只支持方法类型的连接点,  所以在Spring中连接点指的就是被拦截到的方法
  • 切入点(pointcut)

    对连接点进行拦截的定义
  • 通知(advice)

    所谓通知指的就是指拦截到连接点之后要执行的代码,  通知分为前置、后置、异常、最终、环绕通知五类
  • 目标对象

    代理的目标对象
  • 织入(weave)

    将切面应用到目标对象并导致代理对象创建的过程

2.1 实例代码

如果你没看傻眼,那当我什么都没说,请直接看第三点。

否则的话我们还是通过实例代码结合图片的形式来分析:

在这里插入图片描述

通过这张图片再和上面的概念一对比,是不是清晰很多呢?

而关于织入,我们后面几章要讲的就是这个织入的过程。

3、resolveBeforeInstantiation

关于resolveBeforeInstantiation(……)方法,在IOC篇的时候有说过它的作用:找到切面和切点并缓存。所以这个方法在AOP流程中是比较重要的。

protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
Object bean = null; if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
// Make sure bean class is actually resolved at this point. if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
Class
targetType = determineTargetType(beanName, mbd); if (targetType != null) {
bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName); if (bean != null) {
bean = applyBeanPostProcessorsAfterInitialization(bean, beanName); } } } mbd.beforeInstantiationResolved = (bean != null); } return bean;}

有了之前接口回调处理的经验,这段代码的逻辑很明显是进行回调处理。

这里千万要注意的是!applyBeanPostProcessorsBeforeInstantiationapplyBeanPostProcessorsAfterInitialization的区别可不仅仅是在于Before和After

它们是两个接口:BeanPostProcessor、InstantiationAwareBeanPostProcessor提供的方法,而且它们俩生效的时机是不一样的!

3.1 Instantiation和Initialization

这里比较考验眼力,因为它们长得实在是太像了,先了解一下这两个单词的含义:

在这里插入图片描述

一个是实例化,一个是初始化,结合之前IOC流程的理解,Instantiation后缀的接口实现类是在bean实例化阶段进行回调,Initialization后缀的接口实现类则是在bean初始化阶段进行回调

即:早期对象和完整对象

4、结尾

除了上述知识,其它知识点我会在分析源码的时候穿插讲解,接下来我们就正式进入spring AOP的源码解析第一站:切面解析。

转载地址:http://dmfmf.baihongyu.com/

你可能感兴趣的文章
5.15 相约上海!2021 年度首届云原生 Meetup | KubeSphere & Friends
查看>>
使用 Cilium 作为网络插件部署 K8s + KubeSphere
查看>>
万变不离其宗,性能优化也有章可循
查看>>
别再乱用 Prometheus 联邦了,分享一个 Prometheus 高可用新方案
查看>>
Litmus 实践:让群魔在混沌中乱舞,看 K8s 能撑到何时
查看>>
Prometheus 存储层的演进
查看>>
Kubernetes 边缘节点抓不到监控指标?试试这个方法!
查看>>
不对全文内容进行索引的 Loki 到底优秀在哪里
查看>>
太强大了!这些 Go 的难点问题都能解决!
查看>>
万字长文:K8s 创建 pod 时,背后到底发生了什么?
查看>>
后云原生时代,Kubernetes:你看我还有机会吗?
查看>>
Wintun:一款惊艳的 WireGuard 虚拟网卡接口驱动
查看>>
个人学习方法分享
查看>>
时隔多年。。终于有一款云原生消息系统出仕了!
查看>>
[译]数据包在 Kubernetes 中的一生(1)
查看>>
[译]数据包在 Kubernetes 中的一生(2)
查看>>
[译]数据包在 Kubernetes 中的一生(3)
查看>>
从源头解决 Service Mesh 问题最彻底!
查看>>
一次“不负责任”的 K8s 网络故障排查经验分享
查看>>
一次有趣的 Docker 网络问题排查经历
查看>>