美文网首页
Spring5源码解析之IOC-obtainFreshBeanF

Spring5源码解析之IOC-obtainFreshBeanF

作者: Beast_Rattrap | 来源:发表于2018-12-28 14:46 被阅读0次

    上面有一篇提到了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对象,

    相关文章

      网友评论

          本文标题:Spring5源码解析之IOC-obtainFreshBeanF

          本文链接:https://www.haomeiwen.com/subject/hdnslqtx.html