spring原始碼——註冊後置處理器
阿新 • • 發佈:2021-02-04
在下覺得這篇博文是目前把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));