栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring扩展机制之MergedBeanDefinitionPostProcessor

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring扩展机制之MergedBeanDefinitionPostProcessor

文章目录
  • 前言
  • 介绍
  • 源码中的使用
    • spring @Value
    • nacos @value
  • 总结

前言

spring中有这样一个接口MergedBeanDefinitionPostProcessor,本文介绍下这个接口的作用,已经在一些源码中的使用

介绍

MergedBeanDefinitionPostProcessor接口的定义如下

public interface MergedBeanDefinitionPostProcessor extends BeanPostProcessor {

	
	void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class beanType, String beanName);

	
	default void resetBeanDefinition(String beanName) {
	}

}

我们使用一个自定义类来实现该接口测试一下,本文只介绍下这个接口常用的postProcessMergedBeanDefinition方法

@Component
public class MyMergedBeanDefinitionPostProcessor implements MergedBeanDefinitionPostProcessor {

    @Override
    public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class beanType, String beanName) {
        System.out.println(beanName);
    }
    
}

打断点看一下,调用链路如下




获取所有的BeanPostProcessors,如果是MergedBeanDefinitionPostProcessor,则调用它的postProcessMergedBeanDefinition方法

可见这个MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition方法调用的时机是,每一个spring中的bean初始化时都会经过每一个MergedBeanDefinitionPostProcessor的实现类的postProcessMergedBeanDefinition方法

源码中的使用

基于上述触发场景,这个机制大量运用于收集类的某些属性,比如spring处理@Value注解,那么是不是要在bean初始化的时候来提前收集到这些标记了@Value的字段或者方法呢?

spring @Value

AutowiredAnnotationBeanPostProcessor的定义

public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter
		implements MergedBeanDefinitionPostProcessor, PriorityOrdered, BeanFactoryAware {

它的postProcessMergedBeanDefinition方法

@Override
	public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class beanType, String beanName) {
		InjectionMetadata metadata = findAutowiringMetadata(beanName, beanType, null);
		metadata.checkConfigMembers(beanDefinition);
	}

findAutowiringMetadata方法中就是收集@Value注解的字段和方法的,以便在后面可以进行设置属性

nacos @value

NacosValueAnnotationBeanPostProcessor定义

public class NacosValueAnnotationBeanPostProcessor
		extends AbstractAnnotationBeanPostProcessor implements BeanFactoryAware,
		EnvironmentAware, ApplicationListener {

AbstractAnnotationBeanPostProcessor 抽象类定义

public abstract class AbstractAnnotationBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter implements MergedBeanDefinitionPostProcessor, PriorityOrdered, BeanFactoryAware, BeanClassLoaderAware, EnvironmentAware, DisposableBean {

NacosValueAnnotationBeanPostProcessor间接实现了MergedBeanDefinitionPostProcessor

AbstractAnnotationBeanPostProcessor在MergedBeanDefinitionPostProcessor的基础上,提供了扫描某个注解收集的实现,方便我们直接扩展,比如这里的构造方法传入NacosValue,即收集NacosValue注解

public NacosValueAnnotationBeanPostProcessor() {
		super(NacosValue.class);
	}

AbstractAnnotationBeanPostProcessor可以帮助我们把收集好的数据缓存在injectionMetadataCache中,以便后续处理

总结

只要是收集bean上的属性的,比如收集标记了某些注解的字段或者方法,都可以基于MergedBeanDefinitionPostProcessor来进行扩展

如:@Value、@NacosValue、mybatis的@org.apache.ibatis.annotations.Mapper等

这个MergedBeanDefinitionPostProcessor往往结合InstantiationAwareBeanPostProcessor接口配合使用,下一节讲一下InstantiationAwareBeanPostProcessor的作用

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/841296.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号