spring源码笔记 (三)---- 创建用户自定义Bean之前的准备工作

在前边的两篇内容中,我们了解到了BeanDefinition的相关知识,以及创建BeanDefinition以后,通过BeanFactoryPostProcessor接口对BeanDefinition的定制化修改操作。

BeanDefinition加载与定制化修改完成以后,接下来要做什么呢?是不是马上就要开始创建Bean了呢?

BeanPostProcessors的实例化

spring在开始创建用户自定义Bean之前,还做了对BeanPostProcessor接口实现类的实例化。这个接口BeanFactoryPostProcessor接口在名称上很相似又有不同,从名称上大家就可以很容易的区分,BeanFactoryPostProcessor接口主要是针对BeanFactory的后置处理,而BeanPostProcessor接口则是针对Bean的处理。具体就是调用如下方法实现的:

public static void registerBeanPostProcessors(
			ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {

                ...

		// 首先将实现了PriorityOrdered的 BeanPostProcessors进行注册

		// 接下来注册实现了 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);// 注册的BeanPostProcessor 的时机
			nonOrderedPostProcessors.add(pp);
			if (pp instanceof MergedBeanDefinitionPostProcessor) {
				internalPostProcessors.add(pp);
			}
		}
		registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);

		// Finally, re-register all internal BeanPostProcessors.
		sortPostProcessors(internalPostProcessors, beanFactory);
		registerBeanPostProcessors(beanFactory, internalPostProcessors);
		beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
	}

BeanPostProcessor的实例化细节

spring将所有的BeanPostProcessor进行了归类,按照加载顺序使用 PriorityOrdered,Ordered和普通优先级的BeanPostProcessor之间分开。

我们用户自己通过实现BeanPostProcessor接口而创建的类归为第三类。在方法中表示为nonOrderedPostProcessors。可以看出,它的实现步骤在三者中的最后。

这里仅仅是创建这些类的实例,并没有对接口内方法进行调用。

他们的方法调用发生在什么时候呢?

首先贴出BeanPostProcessor接口的源码:

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;
	}

他们的调用时机从方法名上就能清晰的了解到,在用户自定义Bean的 init方法执行之前,调用前置方法 postProcessBeforeInitialization();在用户自定义Bean 的Init方法调用之后,执行 postProcessAfterInitialization()方法。这两个方法的调用将会在后续的文章中做详细的介绍。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值