一文读懂Spring中的BeanFactoryPostProcessor
Spring 是最受欢迎的企业级 Java 应用程序开发框架,数以百万的来自世界各地的开发人员使用 Spring 框架来创建性能好、易于测试、可重用的代码。Spring的一大特性就是框架提供了很好的扩展,以供我们开发人员进行开发和定制自己想要的功能,今天我们就来介绍一下BeanFactoryPostProcessor以及其子接口这个后置处理器的相关内容。
BeanFactoryPostProcessor
- BeanFactoryPostProcessor,从名字我们可以略知一二,其是对BeanFactory的后置处理器。它的主要作用是在Spring容器创建Bean之前,对Bean的定义(BeanDefinition)进行修改或者添加属性或其他操作。这意味着,通过实现 BeanFactoryPostProcessor 接口,其可以在Bean实例化之前,对Bean的配置信息进行调整,从而改变Bean的行为。
- 我们可以通过 BeanFactoryPostProcessor 修改Bean的作用域(singleton、prototype等)、是否懒加载、属性值等。这在某些场景下非常有用,如读取外部配置文件,根据配置动态修改Bean的属性。
- 其接口方法是:void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
其被调用时机如图所示:
在著名的RPC框架dubbo中的 ReferenceAnnotationBeanPostProcessor 就是实现改接口。
他会扫描Spring容器中所有的Bean,查找带有@Reference注解的服务引用,并为其创建代理对象。这个代理对象会拦截服务消费者对服务提供者的调用,并通过Dubbo框架实现远程调用。这样,服务消费者就可以像调用本地服务一样调用远程服务,而不需要关心远程调用的细节。
BeanDefinitionRegistryPostProcessor
- BeanDefinitionRegistryPostProcessor这个接口是 BeanFactoryPostProcessor的子接口。一般说来这个接口更通用更常用。
- 其接口方法是:void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;
- BeanFactoryPostProcessor的借口操作的是BeanFactory,操作范围更广,能处理的事情更多。BeanDefinitionRegistryPostProcessor的方法更专注,只针对BeanDefinitionRegistry进行处理。
- 该方法的也是在bean实例化之前被调用执行,但是执行时机比BeanFactoryPostProcessor更早一些。
- 多用在:
- 动态注册BeanDefinition:可以根据配置文件、注解或其他条件动态注册BeanDefinition,从而实现动态加载 Bean ;
- 修改BeanDefinition:可以修改已有的BeanDefinition,例如修改Bean的属性、依赖关系等;
执行顺序:
在dubbo中的ServiceAnnotationPostProcessor 就继承了 BeanDefinitionRegistryPostProcessor,BeanFactoryPostProcessor,用来实现对dubbo中的service进行解析和处理。
AotContributingBeanFactoryPostProcessor
这个扩展点是一个比较新的扩展点。AotContributingBeanFactoryPostProcessor是Spring框架中的一个扩展点,它是用于支持Spring应用程序的预编译技术(Ahead-of-Time Compilation)的。该技术可以将Spring应用程序的Bean预先编译成本地代码,以提高应用程序的启动速度和运行性能。
AotContributingBeanFactoryPostProcessor接口提供了一个方法:postProcessBeanFactory,该方法在Spring容器启动时被调用,用于为预编译器提供Spring应用程序的元数据。在该方法中,可以通过AotMetadataProvider接口提供Spring应用程序的元数据,例如Bean的定义、依赖关系等,从而支持应用程序的预编译。
Aot目前是一个比较新的技术,在我们平常的编码和使用中我们使用的比较少。所以我们大概了解一下即可。
总结
上诉我们介绍了spring中BeanFactoryPostProcessor的相关知识,希望对大家有所帮助,以上内容就到这里,感谢各位看官老爷们的观看,如果觉得写得好,给个赞支持一下哈!!!
转载自:https://juejin.cn/post/7227453332439711803