1. 程式人生 > 其它 >spring原始碼——註冊後置處理器

spring原始碼——註冊後置處理器

技術標籤:後臺springjava

在下覺得這篇博文是目前把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));