spring refresh()方法详解5 之registerBeanPostProcessors(beanFactory)

	/**
	 * 注册BeanPostProcessor
	 */
	protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
		//注册BeanPostProcessor
		PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
	}

继续向下

	/**
	 * 注册所有的BeanPostProcessor
	 * 顺序:
	 * 	1.实现PriorityOrdered接口的
	 * 	2.实现order接口的
	 * 	3.其他的
	 * 	4.实现MergedBeanDefinitionPostProcessor接口的  spring内部的BeanPostProcessor会实现这个接口
	 * 		前面注册的时候也会注册这些BeanPostProcessor,最后会重新注册一次,重新注册会放到最后
	 * 	5.注册ApplicationListenerDetector 放到最后
	 */
	public static void registerBeanPostProcessors(
			ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {

		//找出所有实现BeanPostProcessor接口的类
		String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);

		// BeanPostProcessor的目标计数
		int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
		//添加BeanPostProcessorChecker(主要用于记录信息)到beanFactory中
		beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

		// 定义不同的变量用于区分: 实现PriorityOrdered接口的BeanPostProcessor、
		//		实现Ordered接口的BeanPostProcessor、普通BeanPostProcessor
		List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();//用于存放实现PriorityOrdered接口的BeanPostProcessor
		List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();//用于存放Spring内部的BeanPostProcessor
		List<String> orderedPostProcessorNames = new ArrayList<>();//用于存放实现Ordered接口的BeanPostProcessor的beanName
		List<String> nonOrderedPostProcessorNames = new ArrayList<>();//用于存放普通BeanPostProcessor的beanName
		for (String ppName : postProcessorNames) {	//遍历分类
			if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {	//PriorityOrdered
				BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
				priorityOrderedPostProcessors.add(pp);	//添加到priorityOrderedPostProcessors
				if (pp instanceof MergedBeanDefinitionPostProcessor) {	//spring内部的
					internalPostProcessors.add(pp);	//添加到internalPostProcessors
				}
			}
			else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {	//Ordered
				orderedPostProcessorNames.add(ppName);	//添加到orderedPostProcessorNames
			}
			else {	//其他的
				nonOrderedPostProcessorNames.add(ppName);	//添加到nonOrderedPostProcessorNames
			}
		}

		// 对实现PriorityOrdered的 进行排序
		sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
		//全部添加到beanFactory中   beanFactory.addBeanPostProcessor
		registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

		// 注册实现Ordered接口的BeanPostProcessors
		List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
		for (String ppName : orderedPostProcessorNames) {
			//拿到ppName对应的BeanPostProcessor实例对象
			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
			orderedPostProcessors.add(pp);//添加到orderedPostProcessors, 准备执行注册
			if (pp instanceof MergedBeanDefinitionPostProcessor) {
				//如果ppName对应的Bean实例也实现了MergedBeanDefinitionPostProcessor接口   则将ppName对应的Bean实例添加到internalPostProcessors
				internalPostProcessors.add(pp);
			}
		}
		// 对实现Ordered的 进行排序
		sortPostProcessors(orderedPostProcessors, beanFactory);
		//全部添加到beanFactory中   beanFactory.addBeanPostProcessor
		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);	//添加
			}
		}
		//全部添加到beanFactory中   beanFactory.addBeanPostProcessor
		registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);

		// 注册所有内部BeanPostProcessors(实现MergedBeanDefinitionPostProcessor接口的)放到最后
		//排序
		sortPostProcessors(internalPostProcessors, beanFactory);
		//全部添加到beanFactory中   beanFactory.addBeanPostProcessor
		registerBeanPostProcessors(beanFactory, internalPostProcessors);

		// 注册ApplicationListenerDetector 放到最后
		beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
	}

排序与注册方法

	private static void sortPostProcessors(List<?> postProcessors, ConfigurableListableBeanFactory beanFactory) {
		Comparator<Object> comparatorToUse = null;
		if (beanFactory instanceof DefaultListableBeanFactory) {
	        // 1.获取设置的比较器
	        comparatorToUse = ((DefaultListableBeanFactory) beanFactory).getDependencyComparator();
		}
		if (comparatorToUse == null) {
	        // 2.如果没有设置比较器, 则使用默认的OrderComparator
	        comparatorToUse = OrderComparator.INSTANCE;
		}
	    // 3.使用比较器对postProcessors进行排序
	    postProcessors.sort(comparatorToUse);
	}

	/**
	 * 遍历添加BeanPostProcessor
	 */
	private static void registerBeanPostProcessors(
			ConfigurableListableBeanFactory beanFactory, List<BeanPostProcessor> postProcessors) {

		for (BeanPostProcessor postProcessor : postProcessors) {
			beanFactory.addBeanPostProcessor(postProcessor);
		}
	}

	/**
	 * 添加BeanPostProcessor
	 * 		先移除之后再添加,顺序会放到最后
	 */
	@Override
	public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {
		Assert.notNull(beanPostProcessor, "BeanPostProcessor must not be null");
		this.beanPostProcessors.remove(beanPostProcessor);	//先移除
		if (beanPostProcessor instanceof InstantiationAwareBeanPostProcessor) {
			this.hasInstantiationAwareBeanPostProcessors = true;
		}
		if (beanPostProcessor instanceof DestructionAwareBeanPostProcessor) {
			this.hasDestructionAwareBeanPostProcessors = true;
		}
		this.beanPostProcessors.add(beanPostProcessor);	//再添加
	}

猜你喜欢

转载自blog.csdn.net/luo_mu_hpu/article/details/107339631