天天看點

spring源碼——注冊後置處理器

在下覺得這篇博文是目前把PostProcessorRegistrationDelegate.registerBeanPostProcessors()解釋得最詳細的

//擷取bean後置處理器名字并轉為數組postProcessorNames
        String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
        
		// Register BeanPostProcessorChecker that logs an info message when
		// a bean is created during BeanPostProcessor instantiation, i.e. when
		// a bean is not eligible for getting processed by all BeanPostProcessors.
		//注冊BeanPostProcessorChecker,當在BeanPostProcessor執行個體化期間建立Bean時,即當某個Bean不适合所有BeanPostProcessor處理時,記錄一條資訊消息
		int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
		//檢查所有bean是否都經過了後置處理器
		beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

		// Separate between BeanPostProcessors that implement PriorityOrdered,
		// Ordered, and the rest.
		//定義變量<BeanPostProcessor> priorityOrderedPostProcessors——優先級最高的後置處理器
		List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
		//定義變量<BeanPostProcessor> internalPostProcessors——内部後置處理器
		List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
		//定義變量<String> orderedPostProcessorNames——第二優先級的後置處理器名
		List<String> orderedPostProcessorNames = new ArrayList<>();
		//t<String> nonOrderedPostProcessorNames——沒排序的後置處理器名
		List<String> nonOrderedPostProcessorNames = new ArrayList<>();
		//周遊bean後置處理器名
		for (String ppName : postProcessorNames) {
		    //如果他們屬于最高優先級,則
			if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
			    //根據bean後置處理器名稱轉為bean後置處理器對象
				BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
				//priorityOrderedPostProcessors(最高優先級)加入此bean對象
				priorityOrderedPostProcessors.add(pp);
				//該bean是否屬于MergedBeanDefinitionPostProcessor(在屬性注入之前處理的後置處理器)
				if (pp instanceof MergedBeanDefinitionPostProcessor) {
					internalPostProcessors.add(pp);
				}
			}
			//屬于第二優先級
			else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
			    //orderedPostProcessorNames加入此bean後置處理器名稱
				orderedPostProcessorNames.add(ppName);
			}
			//都不是則
			else {
			    nonOrderedPostProcessorNames加入此後置處理器名稱
				nonOrderedPostProcessorNames.add(ppName);
			}
		}

		// First, register the BeanPostProcessors that implement PriorityOrdered.
		//首先,執行最高優先級的後置處理器
		//排序
		sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
		//注冊最高優先級的後置處理器
		registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

		// Next, register the BeanPostProcessors that implement Ordered.
		//接下來,處理第二優先級的bean後置處理器
		//定義<BeanPostProcessor> orderedPostProcessors裝載第二優先級的bean後置處理器
		List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
		//循環周遊orderedPostProcessorNames
		for (String ppName : orderedPostProcessorNames) {
		    //根據bean後置處理器名稱轉為bean後置處理器對象
			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
			//pp插入到orderedPostProcessors
			orderedPostProcessors.add(pp);
			//該bean是否屬于MergedBeanDefinitionPostProcessor(在屬性注入之前處理的後置處理器)
			if (pp instanceof MergedBeanDefinitionPostProcessor) {
			    //internalPostProcessors(内部後置處理器)加入該後置處理器
				internalPostProcessors.add(pp);
			}
		}
		//排序orderedPostProcessors
		sortPostProcessors(orderedPostProcessors, beanFactory);
		//注冊orderedPostProcessors
		registerBeanPostProcessors(beanFactory, orderedPostProcessors);

		// Now, register all regular BeanPostProcessors.
		//然後,處理最低優先級的bean後置處理器
		//定義最低優先級的後置處理器集合變量<BeanPostProcessor> nonOrderedPostProcessors
		List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
		for (String ppName : nonOrderedPostProcessorNames) {
		    //根據bean後置處理器名反射出bean後置處理器對象
			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
			//nonOrderedPostProcessors加入此bean後置處理器對象
			nonOrderedPostProcessors.add(pp);
			//該bean是否屬于MergedBeanDefinitionPostProcessor(在屬性注入之前處理的後置處理器)
			if (pp instanceof MergedBeanDefinitionPostProcessor) {
			    internalPostProcessors(内部後置處理器)加入該後置處理器
				internalPostProcessors.add(pp);
			}
		}
		//不經過排序直接注冊nonOrderedPostProcessors
		registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);

		// Finally, re-register all internal BeanPostProcessors.
		//
		//最後,處理内部後置處理器
		//排序internalPostProcessors
		sortPostProcessors(internalPostProcessors, beanFactory);
		//注冊internalPostProcessors
		registerBeanPostProcessors(beanFactory, internalPostProcessors);

		// Re-register post-processor for detecting inner beans as ApplicationListeners,
		// moving it to the end of the processor chain (for picking up proxies etc).
		//重新注冊後處理器以将内部bean檢測為ApplicationListener,并将其移至處理器鍊的末尾(用于拾取代理等)。
		beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
           

流程歸納總結

按照優先級分别進行插入緩存、排序、注冊、清除緩存