spring源码-容器的基本实现
1、容器基本用法
1)实例:
bean的定义:
实体类{属性,set,get}
配置文件:
<bean id="实体类名(首字母小写)" class="实体类路径"/>
测试:
实体类 = new XMLBeanFactory(new ClassPathResource("配置文件全名")).getBean("实体类名(首字母小写)");
2)功能分析:
①读取配置文件.xml
②根据配置文件找到对应类的配置,获取类路径,通过反射机制进行实例化
③调用实例化后的实例
3)Bean加载步骤
XmlBeanDefinitionReader通过继承AbstractBeanDefinitionReader中的方法,使用resourceLoader将资源文件转换为对应的resource;
再通过DoucementLoader对resource文件进行转换,为Document文件;
通过实现接口BeanDefinitionDoucementReader的DefalutBeanDefinitionDoucementReader类对Document进行解析,并使用BeanDefinitionParserDelegate对Document进行解析
2、获取XML的验证模式
DTD:文档定义类型,xml约束语言。
XSD:XML Schema 语言, 描述了XML文档的结构。
1)获取验证模式
getValidationModeForResource(resource) {
//自定义校验
//默认校验
detectValidationMode(inputStream):
读取的行是空或者是注释跳过,当包含DOCTYPE就是DTD,否则为XSD。
}
2)验证文件
验证文件默认加载方式时通过url进行网络下载,这样会造成延迟,一般做法是将验证文件防止到项目中。
对不同的验证模式,spring有不同的解析器解析:
DTD:直接截取systemId最后的xxx.dtd,然后去当前目录下寻找
XSD:默认到META-INF/Spring.schems文件中找到systemId所对应的XSD文件并加载
3、获取Document
经过验证模式,就可以进行Document加载。委托给DocumentLoader接口,由DefaultDocumentLoader实现类获取
4、解析和注册BeanDefinitions
①Document - > element :
document.getDocument ()
②处理profile :
<beans profile="dev"> <beans profile="test"> 可同时配置两套beans用于生成和测试环境,在web.xml中指定Spring.profiles.active值为dev或test
③解析并注册BeanDefinition:
判断bean的类型(node.getNamespaceURL()):
默认类型:<bean id="" class=""> 通过parseDefalutElement方法解析
自定义类型(<tx:annotation-driven/>):通过delegate.paseCustomElement方法解析