Spring 冷知识:一个提前 AOP 的机会

Spring 冷知识:一个提前 AOP 的机会

💡 原文中文,约9300字,阅读约需23分钟。
📝

内容提要

本文讨论了Spring框架中Bean的创建流程,重点介绍了如何通过AOP处理生成代理对象。详细阐述了BeanPostProcessor的工作机制,以及如何利用自定义的TargetSourceCreator来优化Bean的处理流程。最后提供了实践示例,展示自定义TargetSource和TargetSourceCreator的实现。

🔎

延伸解读

提前AOP的触发条件

文章指出,只有当Bean是普通类,既不是代理对象也不是AOP相关类时,才会进入getCustomTargetSource方法。这意味着提前AOP并非对所有Bean生效,而是针对特定Bean的优化手段。开发者需明确目标Bean的类型,避免误用导致代理未按预期生成。

内部容器的关键作用

AbstractBeanFactoryBasedTargetSourceCreator会为每个Bean创建独立的内部容器,并以当前容器为父容器。内部容器会复制配置,但移除AopInfrastructureBean类型的后置处理器,因为AOP代理已提前生成,无需再次处理。这保证了代理对象不会重复增强,也隔离了AOP基础设施的影响。

自定义TargetSourceCreator的初始化时机

自定义的TargetSourceCreator需要设置到AnnotationAwareAspectJAutoProxyCreator中,而后者是BeanPostProcessor。为了在它初始化前完成设置,自定义的BeanPostProcessor必须实现PriorityOrdered接口,确保在AnnotationAwareAspectJAutoProxyCreator之前执行。否则,设置将无效,提前AOP无法生效。

实践中的注意事项

实现自定义TargetSource时,需继承AbstractBeanFactoryBasedTargetSource并重写getTarget方法,通常通过getBeanFactory().getBean(getTargetBeanName())获取目标Bean。同时,TargetSourceCreator必须指定BeanFactory,否则会抛出异常。这些细节是成功实现提前AOP的关键。

❓

Q&A

Spring框架中Bean的创建流程是怎样的?

Spring框架中Bean的创建流程首先会给BeanPostProcessor一个返回代理对象的机会,通过resolveBeforeInstantiation方法实现代理对象的生成。

什么是BeanPostProcessor,它在Bean创建中起什么作用?

BeanPostProcessor是Spring中的一个接口,它允许在Bean实例化之前和之后对Bean进行处理,主要用于返回代理对象。

如何自定义TargetSourceCreator以优化Bean处理流程?

可以通过实现AbstractBeanFactoryBasedTargetSourceCreator接口,创建自定义的TargetSourceCreator,并在AnnotationAwareAspectJAutoProxyCreator中注册。

在Spring中,如何确保自定义的TargetSourceCreator优先初始化?

通过实现PriorityOrdered接口并重写getOrder方法,可以确保自定义的TargetSourceCreator在AnnotationAwareAspectJAutoProxyCreator之前初始化。

getCustomTargetSource方法的作用是什么?

getCustomTargetSource方法用于查找TargetSource对象,以创建Bean的代理对象,如果找到代理对象,则后续的Bean创建流程将不再执行。

如何在Spring中实现AOP的提前处理?

通过在Bean创建过程中使用BeanPostProcessor拦截,并返回一个TargetSource来创建代理对象,从而实现AOP的提前处理。

🏷️

标签

➡️

继续阅读