Spiring初始化BeanFactory源码解读

    技术2025-11-03  5

    在初始化Spring的时候会调用org.springframework.context.support.AbstractApplicationContext#refresh方法,其中

    ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

    会获取BeanFactory。

    /** * Tell the subclass to refresh the internal bean factory. * @return the fresh BeanFactory instance * @see #refreshBeanFactory() * @see #getBeanFactory() */ protected ConfigurableListableBeanFactory obtainFreshBeanFactory() { refreshBeanFactory(); return getBeanFactory(); }

    我们来看refreshBeanFactory方法,他是一个抽象方法,在AbstractRefreshableApplicationContext和GenericApplicationContext都有实现。

    1、AbstractRefreshableApplicationContext中的实现如下

    @Override protected final void refreshBeanFactory() throws BeansException { if (hasBeanFactory()) { destroyBeans(); closeBeanFactory(); } try { //创建一个BeanFactory,默认是DefaultListableBeanFactory DefaultListableBeanFactory beanFactory = createBeanFactory(); beanFactory.setSerializationId(getId()); customizeBeanFactory(beanFactory); //加载配置文件 loadBeanDefinitions(beanFactory); this.beanFactory = beanFactory; } catch (IOException ex) { throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex); } } loadBeanDefinitions方法也是一个抽象方法,由子类来实现加载BeanFactory的配置文件的功能。有以下四个子类: AbstractXmlApplicationContext AnnotationConfigWebApplicationContext GroovyWebApplicationContext XmlWebApplicationContext 对于解析ApplicationContext.xml文件,是在AbstractXmlApplicationContext中: /** * Loads the bean definitions via an XmlBeanDefinitionReader. * @see org.springframework.beans.factory.xml.XmlBeanDefinitionReader * @see #initBeanDefinitionReader * @see #loadBeanDefinitions */ @Override protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException { // Create a new XmlBeanDefinitionReader for the given BeanFactory. 创建ApplicationContext.xml文件的处理类XmlBeanDefinitionReader XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory); // Configure the bean definition reader with this context's // resource loading environment. beanDefinitionReader.setEnvironment(this.getEnvironment()); beanDefinitionReader.setResourceLoader(this); beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this)); // Allow a subclass to provide custom initialization of the reader, // then proceed with actually loading the bean definitions. initBeanDefinitionReader(beanDefinitionReader); loadBeanDefinitions(beanDefinitionReader); }

     

    Processed: 0.009, SQL: 9