工厂分类
ApplicationContext :集工厂功能大成的类型编程
HierarchicalBeanFactory: 父子容器管理
ConfigurableBeanFactory :可配置工厂,scope(单示例,多实例),类型转换,后置处理Bean
AutowireCapableBeanFactory: 自动注入 intinitialBean,DisposeBean
ListableBeanFactory :获取相关的配置信息 constrainsBeanDefinition(工厂中是否包含该bean),getBeanNameForType
DefaultListableBeanFactory 符合上述主要工厂的能力 一个类型
XmlBeanDefinitionReader 使用基于XML配置的信息,完成对象的创建
解析xml文件
以XmlBeanFactory工厂展开学习
XmlBeanFactory中封装了XmlBeanDefinitionReader对象,将xml文件的配置信息以对象的形式体现
在 XmlBeanDefinitionReader类中的doLoadBeanDefinitions方法用来解析Resource
//将Resource封装成Document对象
Document doc = this.doLoadDocument(inputSource, resource);
//解析配置文件的入口
int count = this.registerBeanDefinitions(doc, resource);
registerBeanDefinition方法中的主要执行方法
parseBeanDefinitions解析bean标签内部除profile之外的标签
protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {
if (delegate.isDefaultNamespace(root)) {
NodeList nl = root.getChildNodes();
for(int i = 0; i < nl.getLength(); ++i) {
Node node = nl.item(i);
if (node instanceof Element) {
Element ele = (Element)node;
if (delegate.isDefaultNamespace(ele)) {
this.parseDefaultElement(ele, delegate);//spring默认标签解析
} else {
delegate.parseCustomElement(ele);//自定义标签解析
}
}
}
} else {
delegate.parseCustomElement(root);
}
}
解析默认标签
(1)解析<bean>标签为例
(2)解析<bean>内部标签(重要)
(3)parseBeanDefinitionElement方法解析常用标签的逻辑
(4)registerBeanDefinition注册BeanDefinition到工厂的beanDefinitionmap
(5)fireComponentRegistered扩展方法(注册完成之后,发送一个事件)
解析自定义标签
以mvc标签为例
(1)进入自定义标签解析
(2)核心代码
(3)通过spring.handlers文件中的url找到MVC标签的Handler
(4)在handler中调用init()方法指定各个标签的解析类
工厂创建对象
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
factory.getBean("user");
创建流程:
doGetBean源码分析
getSingleton方法
createBean方法(通过接口回调创建对象)
doCreateBean方法
populateBean方法注入