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图:长卷图