spring 源码分析--IOC容器初始化三

本文详细解析了Spring框架中Bean的初始化过程,包括BeanFactory的创建、Bean定义的加载及解析等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接着说第一节里面的第二个函数和第三个函数:第二个函数很简单创建一个 DefaultListableBeanFactory,从前面看,先是销毁了老的bean,第二个函数创建了新的工厂,,第三个函数自然就是去解析我们的文件,真正的去做初始化的工作了。

 

1.2.2.1.2 createBeanFactory() :在类 AbstractRefreshableApplicationContext 中仅仅只调用如下方法:

return new DefaultListableBeanFactory(getInternalParentBeanFactory());

我们首先去看 DefaultListableBeanFactory 的构成函数,发现需要传入一个 BeanFactory 的参数。 然后再看函数: getInternalParentBeanFactory() 。方法体也只有一句话

return (getParent() instanceof ConfigurableApplicationContext ) ?((ConfigurableApplicationContext ) getParent()).getBeanFactory() : (BeanFactory) getParent();

在看函数 getParent() 事实上返回父类 AbstractApplicationContext 里的字段

       private ApplicationContext parent ;

 

 

1.2.2.1.3 loadBeanDefinitions(beanFactory) :通过一个 XmlBeanDefinitionReader 装载 bean 定义。 在类:

AbstractXmlApplicationContext 中的实现为:

==================================================================

/**

* 这里使用 XMLBeanDefinitionReader 来载入 bean 定义信息的 XML 文件,查看

* XMLBeanDefinitionReader 构造函数需要的是一个 BeanDefinitionRegistry 类。

* 查看类图, DefaultListableBeanFactory 实现了 BeanDefinitionRegistry 类,

*/

XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory) ;

/**

* 这里配置 reader 的环境,其中 ResourceLoader 是我们用来定位 bean 定义信息资源位置的  

* 因为上下文本身实现了 ResourceLoader 接口,所以可以直接把上下文作为

* ResourceLoader 传递给 XmlBeanDefinitionReader  

*/

beanDefinitionReader.setResourceLoader( this );

beanDefinitionReader.setEntityResolver( new ResourceEntityResolver( this ));

// 该方法为一个空的方法,用以允许子类实现,来初始化 the reader,

initBeanDe finitionReader(beanDefinitionReader);

// 这里转到定义好的 XmlBeanDefinitionReader 中对载入 bean 信息进行处理

loadBeanDefinitions(beanDefinitionReader);

====================================================================

 

 

 

1.2.2.1.3.1 loadBeanDefinitions(beanDefinitionReader): 使用传进来的

XmlBeanDefinitionReader 来装载 bean 的定义。在 AbstractXmlApplicationContext 中的定义:

====================================================================

protected void loadBeanDefinitions(XmlBeanDefinitionReader reader){

// 函数: getConfigResources 代码: return null;

Resource[] configResources = getConfigResources();

if (configResources != null ) {   

        reader .loadBeanDefinitions(configResources);

}

/**

* 得到 AbstractRefreshableConfigApplicationContext 的字 段 configLocations

* 的值,也就 FileSystemXmlApplicationContext (String configLocation) 的参数。(前面函数1.1 将值存入)

*/

String[] configLocations = getConfigLocations();

if (configLocations != null ) {

/ / 调用 XmlBeanDefinitionReader 来载入 bean 定义信息。

        reader.loadBeanDefinitions(configLocations)

}

}

====================================================================

返回

 

本站支持 pay for your wishes

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值