spring5.0 源码解析(day04)registerBeanPostProcessors(beanFactory);

registerBeanPostProcessors(beanFactory)

该方法主要用于 ** 注册bean的后置处理器,在Bean 创建过程中调用** 这一步的主要功能注册后置处理器
BeanPostProcessor 接口是 Spring 初始化 bean 时对外暴露的扩展点,Spring IoC 容器允许 BeanPostProcessor 在容器初始化 bean 的前后,添加自己的逻辑处理。**在 **registerBeanPostProcessors 方法中是将BeanPostProcessor 注册到容器中统一管理

// 允许自定义修改新bean实例的一个钩子方法
public interface BeanPostProcessor {
	// 应用于任何bean之前的给定新bean实例
	default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}
	// 应用于任何bean之后的给定新bean实例
	@Nullable
	default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}
}

BeanPostProcessor 实现类和 BeanFactoryPostProcessor 实现类一样,也可以通过实现 PriorityOrdered、Ordered 接口来调整优先级 一次加入到容器中

String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);

		// 注册 BeanPostProcessorChecker,
		// 它会在 BeanPostProcessor 实例化期间创建 bean 时记录信息消息,
		// 即当 bean 没有资格被所有 BeanPostProcessor 处理时。
		// 在 BeanPostProcessor 实例化期间创建一个 bean,即当一个 bean 没有资格被所有 BeanPostProcessor 处理时。

		// beanProcessorTargetCount 用于目标计数  这个加法运算
		int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
		// BeanPostProcessorChecker 主要用于 BeanPostProcessor实例化 创建是记录信息
		beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

		// Separate between BeanPostProcessors that implement PriorityOrdered,
		// Ordered, and the rest.  四个集合 区分实现不同接口的 BeanPostProcessors
		List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>(); //优先排序后处理器
		List<BeanPostProcessor> internalPostProcessors = new ArrayList<>(); //内部后处理器
		List<String> orderedPostProcessorNames = new ArrayList<>();  //有序的后处理器名称
		List<String> nonOrderedPostProcessorNames = new ArrayList<>(); // 非有序后处理器名称
		for (String ppName : postProcessorNames) {
			if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
				BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
				priorityOrderedPostProcessors.add(pp);
				if (pp instanceof MergedBeanDefinitionPostProcessor) {
					internalPostProcessors.add(pp);
				}
			}
			else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
				orderedPostProcessorNames.add(ppName);
			}
			else {
				nonOrderedPostProcessorNames.add(ppName);
			}
		}

		// 首先,注册实现PriorityOrdered的BeanPostProcessors.
		sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
		registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

		// 接下来,注册实现 Ordered 的 BeanPostProcessors.
		List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
		for (String ppName : orderedPostProcessorNames) {
			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
			orderedPostProcessors.add(pp);
			if (pp instanceof MergedBeanDefinitionPostProcessor) {
				internalPostProcessors.add(pp);
			}
		}
		sortPostProcessors(orderedPostProcessors, beanFactory);
		registerBeanPostProcessors(beanFactory, orderedPostProcessors);

		//现在,注册所有常规 BeanPostProcessors
		List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
		for (String ppName : nonOrderedPostProcessorNames) {
			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
			nonOrderedPostProcessors.add(pp);
			if (pp instanceof MergedBeanDefinitionPostProcessor) {
				internalPostProcessors.add(pp);
			}
		}
		registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);

		// 最后,重新注册所有内部 BeanPostProcessors.
		sortPostProcessors(internalPostProcessors, beanFactory);
		registerBeanPostProcessors(beanFactory, internalPostProcessors);

		// 重新注册用于将内部 bean 检测为 ApplicationListeners 的后处理器,
		// 将其移动到处理器链的末尾(用于获取代理等).
		beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));

在addBeanPostProcessor() 方法中我们可以看到 如果 BeanPostProcessor 存在 它会被放到尾部,
因为 BeanPostProcessor 调用是采用责任链模式 所以beanPostProcessor也要严格按照顺序存储

public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {
		Assert.notNull(beanPostProcessor, "BeanPostProcessor must not be null");
		// Remove from old position, if any
		this.beanPostProcessors.remove(beanPostProcessor);
		// Add to end of list
		this.beanPostProcessors.add(beanPostProcessor);
	}

在这里插入图片描述

通过 registerBeanPostProcessors 加载到容器中 beanPostProcessors
在这里插入图片描述

ApplicationContextAwareProcessor

ApplicationContextAwareProcessor 是在 prepareBeanFactory()时添加进去的
ApplicationContextAwareProcessor实现了BeanPostProcessor接口。并只重新定义了postProcessBeforeInitialization初始化前方法。可以让bean感知到容器的存在

ApplicationListenerDetector

ApplicationListenerDetector也是在 prepareBeanFactory()时添加进去的

他的功能是检查bean 是否是ApplicationListener的子类 如果是则添加到ApplicationListener 中

ConfigurationClassPostProcessor

他是在为主配置类生成代理时传递进去的

它的主要功能是参与BeanFactory的建造,在这个类中,会解析加了@Configuration的配置类,还会解析@ComponentScan、@ComponentScans注解扫描的包,以及解析@Import等注解。

DestructionAwareBeanPostProcessor

在销毁 Bean 前执行 Bean 所声明的自定义销毁方法,该回调只能应用到单例Bean。
具体实现之一: InitDestroyAnnotationBeanPostProcessor:调用@PreDestroy注解的销毁方法。

PostProcessorRegistrationDelegate

用来注册和执行 BeanPostProcessor 和 BeanFactoryPostProcessors

MergedBeanDefinitionPostProcessor

MergedBeanDefinitionPostProcessor 接口是 BeanPostProcessor 的子接口,用于寻找注入点,所谓注入点其实就是被 Spring 所支持的注解所标记的属性或者方法,在AbstractAutowireCapableBeanFactory 类的 doCreateBean 方法中,Bean 被实例化之后就会调用applyMergedBeanDefinitionPostProcessors 方法。执行该后置处理器的postProcessMergedBeanDefinition 方法。
MergedBeanDefinitionPostProcessor 有许多的子类,其中两个比较重要,分别是 AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor

AutowiredAnnotationBeanPostProcessor

AutowiredAnnotationBeanPostProcessor实现了 MergedBeanDefinitionPostProcessor,作用是查找bean中的被**@Autowired、@Value** 注解标注的属性与方法,如果有javax.inject.Inject依赖,那么也会查找被@Inject注解标注的属性与方法, 封装成InjectionMetadata对象。

CommonAnnotationBeanPostProcessor

CommonAnnotationBeanPostProcessor继承了 InitDestroyAnnotationBeanPostProcessor类。而InitDestroyAnnotationBeanPostProcessor类实现了MergedBeanDefinitionPostProcessor。
作用与 AutowiredAnnotationBeanPostProcessor大致相同,只不过针对的是不同的注解。常见的注解有@PostConstruct、@PreDestroy、@Resource。如果有相对应的依赖,也可以使用@WebServiceRef、@EJB,也会被封装成InjectionMetadata对象。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1999

每人一点点,明天会更好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值