首页 > 其他分享 >Spring AOP初探

Spring AOP初探

时间:2024-03-20 22:45:35浏览次数:23  
标签:逻辑 匹配 Spring AOP bean 初探 执行 方法

Spring AOP初探


Spring aop,翻译成中文就是面向切面编程;笔者的个人理解是当spring框架执行一系列方法的时候,通过某种机制匹配到各个需要添加额外逻辑的方法也就是执行点,这些执行点类似数学概念中的一个个点,然后一个个点连起来就成为一个平面了;所有的执行点都会被匹配规则匹配到,然后执行统一的一些逻辑;下面我们来简单介绍一下Spring是如何通过规则找到一个方法是否需要被拦截住,是否需要执行一些通用逻辑,然后浅析spring是如何创造出一个对象的代理对象的过程。

首先介绍两个很重要的接口,BeanPostProcessor和BeanFactoryPostProcessor;spring框架启动时会去调用这两个接口的实现,分别执行接口方法的实现。贴一下这两个接口的定义


public interface BeanPostProcessor {
	@Nullable
	default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}

	@Nullable
	default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}

}


public interface BeanFactoryPostProcessor {
	void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;

}


这里给出笔者的一个想法,其实spring的aop就是靠调用这两个接口来实现的,因为spring在初始化自身容器时会在不同的时机调用这两个接口的实现类,尤其是BeanPostProcessor,通过子实现去决定一个bean或者bean的方法是不是和匹配规则能苟匹配上,将匹配规则对于的额外逻辑形成一个调用链,在调用对应方法的时候判断是否需要调用额外逻辑。

碎碎念,Spring这里面的概念真混乱,能够在spring AOP中需要认识的对象有JoinPoint,我认为是方法执行的一个抽象,通过拦截规则拦截到的方法都是一个JoinPoint

public interface Joinpoint {
	@Nullable
	Object proceed() throws Throwable;
	@Nullable
	Object getThis();

	@Nonnull
	AccessibleObject getStaticPart();

}

展示一下继承图,Spring使用的主要是ReflectiveMethodInvocation,这个对象里面的proceed方法会找到匹配当前方法的增强逻辑链,然后将链路上的增强逻辑都调用一遍,当然也会调用本方法执行逻辑

上面讲到了Spring将被拦截到的方法抽象成了MethodInvocation,那接下来就介绍Spring拦截到方法后,把需要执行的逻辑抽象成了Advice.

public interface Advice {
// 是个空实现
}

可以看到,Spring实现了五种Advice,分别对应在真正需要执行方法的不同时期执行额外逻辑,这些Advice实现类都封装了需要执行的额外逻辑。

第三个对象是PointCut,用来匹配增强逻辑是否能苟匹配到方法或者对象,可以看到,这个接口拥有两个对象,分别来匹配对象或者方法的,这个接口的作用就是将JoinPoint和Advice联系起来

public interface Pointcut {
	ClassFilter getClassFilter();
        
	MethodMatcher getMethodMatcher();

	Pointcut TRUE = TruePointcut.INSTANCE;

}

我们也重点关注一部分实现

这下子就齐全了,需要执行的额外逻辑,匹配表达式,匹配到的方法。然后执行匹配额外逻辑和方法的逻辑就藏在AbstractAutoProxyCreatror对象里面,可以看到,该对象继承了我们一开始提出的BeanPostProcessor,也就是在Spring容器初始化过程中,会把这些实现类收集起来,一起执行postProcessBeanBeforeInitialization和postProcessBeanAfterInitialization方法,也就是AbstractAutoProxyCreator对象里面的方法就是会去执行寻找当前正在初始化的bean匹配的advice,并且将advice都装起来,和真正的bean一起包装成一个代理对象交给Spring容器,进而获得了Spring动态代理对象。

以上逻辑就是Spring获得代理对象的原理,详细代码后面还得深入到具体的对象里面去看

标签:逻辑,匹配,Spring,AOP,bean,初探,执行,方法
From: https://www.cnblogs.com/ykmStudy/p/18086290

相关文章

  • 基于Springboot的在线装修管理系统(有报告)。Javaee项目,springboot项目。
    演示视频:基于Springboot的在线装修管理系统(有报告)。Javaee项目,springboot项目。项目介绍:采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringBoot+Mybatis+Vue+Maven+Layui+Elementui来实现。MySQL数据库作为系统数据储存平台,实现了基于B/S结构的Web系统......
  • spring refresh的流程(AbstractApplicationContext的refresh方法)
    12个阶段1、prepareRefresh,做准备工作2、obtainFreshBeanFactory,创建或获取beanfactory3、prepareBeanFactory,准备beanfactory4、postProcessBeanFactory,子类扩展beanfactory5、invokeBeanFactoryPostProcessors,后处理器扩展beanfactory6、registerBeanPostProcessors,准备b......
  • 基于springboot的考研资讯交流平台
    摘  要随着现在网络的快速发展,网络的应用在各行各业当中它很快融入到了许多学校的眼球之中,他们利用网络来做这个电商的服务,随之就产生了“考研资讯平台”,这样就让学生考研资讯平台更加方便简单。对于本考研资讯平台的设计来说,它主要是采用java技术。在整个系统的设计当中......
  • 初探 Cocos Creator: 碰撞与物理系统
    前言不知道你刚开始玩碰撞时,会不会遇到始终无法触发碰撞事件?玩物理系统时,自由落体的刚体会穿过“地面”刚体等情况?没错我全都遇到过,那么下面我就用红蓝色方块,简单实战一下CocosCreator的碰撞与物理系统。 场景创建场景很简单,一个白色背景,两个红蓝色玩家,和一个绿色大草......
  • 在非标准Spring组件中(比如websocket)注入Spring管理bean的方法
    privatestaticUserMapperuserMapper;@AutowiredpublicvoidsetUserMapper(UserMapperuserMapper){WebSocketServer.userMapper=userMapper;}WebSocketServer是通过JavaWebSocketAPI创建的,并且由于@ServerEndpoint不是Spring的标准组件注解,直......
  • Spring三级缓存及循环依赖的解决
    三级缓存的概念是针对单例bean来说的,原型的bean是每次直接创建新的bean对象,IoC容器中,同一个bean或者其代理对象只能存在一个,不能同时存在 一级缓存存放完整的bean(实例化和初始化都已完成)二级缓存提前曝光的不完整的bean(可能是bean,也可能是bean的AOP代理,未进行初始化) 作用......
  • spring使用jdk17运行出现编码问题
    遇到一个比较奇怪的问题。这个问题别人也遇到过。https://blog.csdn.net/gao_chuan_g/article/details/115117712一、情况简介使用jdk17+springboot3.x+spring6.x写一个小应用A,其中有一部分代码是用于生成SM2加密后的字符串,这个字符串会再做一些处理,最终会显示在前端的页面。......
  • Spring boot2.7整合jetcache方法缓存 处理数据发生变化时同步更新缓存 删除缓存操作
    上文Springboot2.7整合jetcache方法缓存我们做了个方法缓存的案例可以将接口内容缓存起来是能大大提高效率的但是我们接口的数据大多来自数据库如果我们调用增删查改它的数据变化了那缓存的内容就会因为没有及时更新变的不准确例如我们这样我们在上面定义了......
  • Spring boot2.7整合jetcache方法缓存
    前面的文章我们讲了springboot整合jetcache做基本字符串数据缓存但是我这里有个这样的逻辑我的domain包下有一个book属性类里面就id和name属性设置了对应的setget函数和一个整体的构造函数packagecom.example.javadom.domain;publicclassboo......
  • 【数据脱敏方案】不使用 AOP + 注解,使用 SpringBoot+YAML 实现
    文章目录引入认识YAML格式规范定义脱敏规则格式脱敏逻辑实现读取YAML配置文件获取脱敏规则通过键路径获取对应字段规则原始优化后对数据进行脱敏处理递归生成字段对应的键路径脱敏测试完整工具类引入在项目中遇到一个需求,需要对交易接口返回结果中的指定字段......