spring執行流程:
1: 加載spring.xml文件
2: 創建xml文件解析器
3: 獲取命名空間,即在spring.xml文件中的 http://www.springframework.org/schema/context
4: 根據命名空間找到命名空間處理器,在命名空間處理器中包含多個屬性解析器:
{annotation-config=org.springframework.context.annotation.AnnotationConfigBeanDefinitionParser@21cdca84, mbean-server=org.springframework.context.config.MBeanServerBeanDefinitionParser@4daab172, spring-configured=org.springframework.context.config.SpringConfiguredBeanDefinitionParser@167db34, property-placeholder=org.springframework.context.config.PropertyPlaceholderBeanDefinitionParser@496833a4, load-time-weaver=org.springframework.context.config.LoadTimeWeaverBeanDefinitionParser@581679a2, component-scan=org.springframework.context.annotation.ComponentScanBeanDefinitionParser@2b8ba7dc, property-override=org.springframework.context.config.PropertyOverrideBeanDefinitionParser@5db972d9, mbean-export=org.springframework.context.config.MBeanExportBeanDefinitionParser@3a2334a1
}
<context:component-scan /> 每一個 這樣的標簽都會對應一個解析器
context:annotation-config/
context:load-time-weaver/
context:mbean-export/
context:mbean-server/
context:property-override/
context:property-placeholder/
context:spring-configured/
5: 根據處理器 獲得 標簽<context:component-scan /> 解析器 ComponentScanBeanDefinitionParser
6:ComponentScanBeanDefinitionParser解析器開始解析調用Parse 方法
7:根據<context:component-scan /> 中的掃描路徑進行處理,并加載class文件信息
8:利用ASM技術去解讀class文件獲得class中的信息,spring提供了一些ASM類例如:
import org.springframework.asm.AnnotationVisitor; //查看class文件有哪些注解
import org.springframework.asm.Attribute; //查看class文件有哪些屬性
import org.springframework.asm.ClassVisitor; //
import org.springframework.asm.FieldVisitor; //查看class文件有哪些字段
import org.springframework.asm.MethodVisitor; //查看class文件有哪些方法
import org.springframework.asm.Opcodes;
import org.springframework.asm.SpringAsmInfo;
9:解析完class文件生成beandefinition 對象,beandefinition對象是對bean 定義描述,例如,創建bean的策略,初始方法,等等。
10:最后根據beandefinition 生成 bean對象,放入 spring容器中,spring容器是一個ConcurrentHashMap
以上是spring的大體流程,下面是我跟蹤spring源碼所畫的springUML圖:長卷圖