Spring源码解析--工厂

工厂分类

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方法注入

​​​​​​​

  • 28
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值