Spring-源码概述
Spring容器加载方式
类路径获取配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(“spring.xml”);
文件系统路径获取配置文件(绝对路径)
ApplicationContext applicationContext = new FileSystemXmlApplicationContext(“E:\spring.xml”);
无配置文件加载容器
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(“com.XX”);
springboot加载容器
ApplicationContext applicationContext = new EmbeddedWebApplicationContext();
Spring容器加载核心方法
AbstractApplicationContext.refresh()
refresh()方法是Spring容器启动过程中的核心方法,容器加载必须要执行该方法
XML解析流程
AbstractApplicationContext获取BeanFactory,调用AbstractRefreshableApplicationContext解析XML,并把XML中的标签封装成BeanDefinition,继续调用AbstractXmlApplicationContext,委托给AbstractBeanDefinitionReader进行解析,具体落实到XmlBeanDefinitionReader解析,之后在BeanDefinitionParseDelegate类中创建GenericBeanDefinition对象,解析bean标签并将属性设置到BeanDefinition对象中
BeanDefinition介绍
在Spring中贯穿始终,Spring要根据BeanDefinition对象来实例化Bean,只要把解析的标签,扫描的注解类封装成BeanDefinition对象,Spring容器才能实例Bean。
BeanDefinition实现类:
ChildBeanDefinition、GenericBeanDefinition、RootBeanDefinition
ChildBeanDefinition
可以继承父类的设置,从父类继承构造参数值,属性值可以重写父类的方法,同时也可以增加新的属性或方法,若指定初始化方法、销毁方法或静态工厂方法,ChildBeanDefinition将重写相应父类的设置。
GenericBeanDefinition
支持动态定义父依赖,GenericBeanDefinition可以有效替代ChildBeanDefinition的绝大多数使用场合,是一站式的标准Bean Definition,主要用来注册用户可见的bean definition。
RootBeanDefinition
用来在配置阶段进行注册bean definition。