1. 程式人生 > >spring原始碼分析之@ImportSelector、@Import、ImportResource工作原理分析

spring原始碼分析之@ImportSelector、@Import、ImportResource工作原理分析

複製程式碼
/**
     * Apply processing and build a complete {@link ConfigurationClass} by reading the
     * annotations, members and methods from the source class. This method can be called
     * multiple times as relevant sources are discovered.
     * @param configClass the configuration class being build
     * 
@param sourceClass a source class * @return the superclass, or {@code null} if none found or previously processed */ protected final SourceClass doProcessConfigurationClass(ConfigurationClass configClass, SourceClass sourceClass) throws IOException { // Recursively process any member (nested) classes first
processMemberClasses(configClass, sourceClass); // Process any @PropertySource annotations for (AnnotationAttributes propertySource : AnnotationConfigUtils.attributesForRepeatable( sourceClass.getMetadata(), PropertySources.class, org.springframework.context.annotation.PropertySource.class
)) { if (this.environment instanceof ConfigurableEnvironment) { processPropertySource(propertySource); } else { logger.warn("Ignoring @PropertySource annotation on [" + sourceClass.getMetadata().getClassName() + "]. Reason: Environment must implement ConfigurableEnvironment"); } } // Process any @ComponentScan annotations Set<AnnotationAttributes> componentScans = AnnotationConfigUtils.attributesForRepeatable( sourceClass.getMetadata(), ComponentScans.class, ComponentScan.class); if (!componentScans.isEmpty() && !this.conditionEvaluator.shouldSkip(sourceClass.getMetadata(), ConfigurationPhase.REGISTER_BEAN)) { for (AnnotationAttributes componentScan : componentScans) { // The config class is annotated with @ComponentScan -> perform the scan immediately Set<BeanDefinitionHolder> scannedBeanDefinitions = this.componentScanParser.parse(componentScan, sourceClass.getMetadata().getClassName()); // Check the set of scanned definitions for any further config classes and parse recursively if necessary for (BeanDefinitionHolder holder : scannedBeanDefinitions) { if (ConfigurationClassUtils.checkConfigurationClassCandidate(holder.getBeanDefinition(), this.metadataReaderFactory)) { parse(holder.getBeanDefinition().getBeanClassName(), holder.getBeanName()); } } } } // Process any @Import annotations processImports(configClass, sourceClass, getImports(sourceClass), true); // Process any @ImportResource annotations if (sourceClass.getMetadata().isAnnotated(ImportResource.class.getName())) { AnnotationAttributes importResource = AnnotationConfigUtils.attributesFor(sourceClass.getMetadata(), ImportResource.class); String[] resources = importResource.getStringArray("locations"); Class<? extends BeanDefinitionReader> readerClass = importResource.getClass("reader"); for (String resource : resources) { String resolvedResource = this.environment.resolveRequiredPlaceholders(resource); configClass.addImportedResource(resolvedResource, readerClass); } } // Process individual @Bean methods Set<MethodMetadata> beanMethods = sourceClass.getMetadata().getAnnotatedMethods(Bean.class.getName()); for (MethodMetadata methodMetadata : beanMethods) { configClass.addBeanMethod(new BeanMethod(methodMetadata, configClass)); } // Process default methods on interfaces processInterfaces(configClass, sourceClass); // Process superclass, if any if (sourceClass.getMetadata().hasSuperClass()) { String superclass = sourceClass.getMetadata().getSuperClassName(); if (!superclass.startsWith("java") && !this.knownSuperclasses.containsKey(superclass)) { this.knownSuperclasses.put(superclass, configClass); // Superclass found, return its annotation metadata and recurse return sourceClass.getSuperClass(); } } // No superclass -> processing is complete return null; }
複製程式碼

相關推薦

spring原始碼分析@ImportSelector@ImportImportResource工作原理分析

/** * Apply processing and build a complete {@link ConfigurationClass} by reading the * annotations, members and methods from the source class.

java原始碼分析集合框架SortedMap NavigableMap Dictionary 09

SortedMap SortedMap也是一個介面,繼承與Map介面,Sorted表示它是一個有序的鍵值對映。 SortedMap的排序方式有兩種:自然排序和指定比較器排序。插入有序的SortedMap的所有元素都必須實現Comparable介面

springmvc源碼分析請求參數類型轉換數據綁定

數據 and springmvc 行業 mvc 處理 mapping htm 參數 前言 通過前面的分析,我們知道了請求過來,怎麽找到相應的handlerMethod。本篇對請求參數的轉換進行講解。 概述 在進行分析之前,我們回到DispatcherServlet的do

資料分析numpy常用知識點難點梳理

一、與random有關的一些函式的區別,首先匯入numpy import numpy as np np.random.randint(low, high=None, size=None, dtype=‘l’) 從low到high的範圍隨機取整數填充多維陣列, size用於

spring原始碼學習路---深度分析IOC容器初始化過程(三)

分析FileSystemXmlApplicationContext的建構函式,到底都做了什麼,導致IOC容器初始化成功。 public FileSystemXmlApplicationContext(String[] configLocations, boolean ref

SpringBoot原始碼學習路(七SpringBoot中對SpringMVC的自動配置)

SpringMVC自動配置 一. Spring MVC auto-configuration 對於SpringMVC的自動配置下面只是介紹了部分,如果想要了解更多Boot對SpringMVC的預設配置可以查閱原始碼結合官方文件瞭解。 原始

spring原始碼學習整合Mybatis原理分析

開發十年,就只剩下這套架構體系了! >>>   

springboot原始碼解析SpringApplication初始化啟動

開發十年,就只剩下這套架構體系了! >>>   

攜程函數遞歸二分法importfrom。。。import

。。 for 空間 打印 name 打開文件 from else 流水線 攜程函數 與yield類似 yield: 1:把函數的執行結果封裝好__iter__和__next__,即得到一個叠代器 2:與return功能類似,都可以返回值,但不同的是,return只能 返回一

Java學習(匿名對象內部類import代碼塊)

-c 兩種 args 圖片 eth 調用 [] 語句 並且 一、匿名對象 概念:匿名對象是指在創建對象時,只有創建的語句,卻沒有把對象地址值賦給某個變量。 特點: (1)匿名對象直接使用,沒有變量名。當做形參使用。 new Person().name="張三";

spring原始碼解析AOP原理

一、準備工作   在這裡我先簡單記錄下如何實現一個aop: AOP:【動態代理】 指在程式執行期間動態的將某段程式碼切入到指定方法指定位置進行執行的程式設計方式; 1、匯入aop模組;Spring AOP:(spring-aspects) 2、定義一個業務邏輯類(

Spring原始碼窺探Spring IOCBeanPostProcessor

Spring的Bean後置處理器 1. 實體類 /** * @author 70KG * @Title: Train * @Description: * @date 2018/7/23下午11:31 * @From www.nmyswls.com */ public cla

Spring原始碼窺探Spring IOCFactoryBean

1. 定義Fish實體類 /** * @author 70KG * @Title: Fish * @Description: * @date 2018/7/22下午5:00 * @From www.nmyswls.com */ @Data public class Fish

spring原始碼學習路---IOC容器初始化要義bean定義載入(四)

上章說到要帶各位去看看bean定義載入的要義,其實就是loadBeanDefinitions這個方法的具體實現步驟,下面我們跟隨這個方法去看下它到底是如何載入bean定義的。 上面是我擷取的實現了loadBeanDefinitions的類級別截圖,loadBeanDefinit

spring原始碼學習路---IOC實現原理(二)

上一章我們已經初步認識了BeanFactory和BeanDefinition,一個是IOC的核心工廠介面,一個是IOC的bean定義介面,上章提到說我們無法讓BeanFactory持有一個Map package org.springframework.beans.factory.supp

spring原始碼學習路---IOC初探(一)

首先把spring原始碼匯入,怎麼匯入百度下。 首先我們來說一下IOC,IOC是spring最核心的理念,包括AOP也要屈居第二,那麼IOC到底是什麼呢,四個字,控制反轉。 網上有不少是這麼解釋IOC的,說IOC是將物件的建立和依賴關係交給容器,這句話我相信不少人都知道,在我個人的理解

spring原始碼-BeanPostProcessor-3.3 spring原始碼-bean載入-2

  一、BeanPostProcessor這個是spring容器的拓展之一,是用於獲取bean的時候處理對應的物件;   二、常用場景,在獲取bean的時候,重新初始化bean的屬性等。   三、實現方式(加入容器後,呼叫其他bean的時候,通過BeanPostProcessor來進行處理) im

Spring原始碼解析 Spring Security啟動細節和工作模式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

spring原始碼-Aware-3.4 spring原始碼-bean載入-2

  一、Aware介面,這個也是spring的拓展之一,為啥要單獨拿出來講呢,因為他相比於BeanFactoryPostProcessor,BeanPostProcessor的實用性更加高,並且在具體的業務中也可以靈活使用,主要是能夠達到解耦的目的。   二、常用的Aware介面有:第一類:BeanName

exportimportexport default區別

export用於對外輸出本模組(一個檔案可以理解為一個模組)變數的介面 import用於在一個模組中載入另一個含有export介面的模組 使用範圍 require: node 和 es6 都支援的引入 export / import : 只有es6 支援的匯出引入