上面有一篇提到了obtainFreshBeanFactory的方法,没有做具体解释,这里就具体分析下这个方法的功能。
代码如下:
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
refreshBeanFactory();
return getBeanFactory();
}
主要功能
1.refreshBeanFactory
protected final void refreshBeanFactory() throws BeansException {
if (hasBeanFactory()) {
destroyBeans();
closeBeanFactory();
}
try {
DefaultListableBeanFactory beanFactory = createBeanFactory();
beanFactory.setSerializationId(getId());
customizeBeanFactory(beanFactory);
loadBeanDefinitions(beanFactory);
synchronized (this.beanFactoryMonitor) {
this.beanFactory = beanFactory;
}
}
catch (IOException ex) {
throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
}
}
解释:上面那段if的代码,是判断你之前是否已经有BeanFactory了,这个一般是没有的,但是保不齐,你在程序的运行当中你拿到了AbstractApplicationContext的对象,那么,你如果调用refresh方法,这个时候if那段里面的destroyBeans和closeBeanFactory这俩方法就会执行了,这俩方法的作用就是把你之前生成的所有对象都给你清除了然后beanFactory设置为null。之后下面就像是没事人一样子,从新开始创建BeanFactory,设置id,以及读取配置文件,形成BeanDefinition对象,存储起来。
对于createBeanFactory没啥好说的,就是new了一个DefaultListableBeanFactory的对象。这里需要注意下,BeanFactory是制作Bean的工厂,也就是说Spring的IOC所持有的对象都是BeanFactory给制造出来的。Spring的IOC说的官方点:自动装配。虽然是自动装配,但是还是需要new对象出来,那么这个活是BeanFactory干的。还有一个接口叫FactoryBean,这个接口的作用是你的Bean需要一些特殊操作,不是new一下这么简单,FactoryBean就是干这个特殊操作的接口,说白了就是工厂模式的接口。还有需要注意一点Spring整个对外提供服务的是ApplicationContext,BeanFactory只是内部工厂。这就像一个国家对外展示肌肉的是军队和外交部,工厂和生产是在国内,不朝外展示的,我们要记住这些个默默无闻的工厂。
着重介绍下loadBeanDefinitions方法
首先说一下Spring的总体思路:Spring既然是号称是配置形式,那么就有配置文件,xml是一种,但是xml读取到Spring内部是怎么处理的?Spring的xml配置文件被读取之后,会根据你配置的各种属性和节点,在Spring内部存储成BeanDefinition的对象形式,每个标签一个BeanDefinition对象,
网友评论