Spring AOP初探

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获得代理对象的原理,详细代码后面还得深入到具体的对象里面去看

posted @   我有一口玄黄气  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示