- Spring如何将创建的对象放到IoC容器中?
先创建容器,先创建的是ClassPathXmlApplicationContext,直到他继承链的AbstractRefreshableApplicationContext类中有一个DefaultListableBeanFactory对象,他才是真正的容器。接下来解释Spring如何将创建的对象放到IoC容器中。
将通过ResourceLoader读出来的对象用BeanRegister利用反射机制将这个对象拆分成一个BeanDefinition(对象定义)(BeanRegister是从DefaultResourceLoader中读到的这个对象的),然后再将这个BeanDefinition植入到DefaultListableBeanFatory中(这个容器来承载BeanRegister创建出来DefaultListableBeanFactory对象,他才是真正的容器DefaultListableBeanFactory对象)。
ClassPathXmlApplicationContext的继承链中有一些关键信息,即:AbstractRefreshableApplicationContext中一个DefaultListableBeanFactory,这个对象和ApplicationContext强耦合,这个对象就是容器。而ApplicationContext是容器的操作类。(ApplicationContext和BeanFactory没有继承关系)
这个DefaultListableBeanFatory是写在AbstractRefreshableApplicationContext中的,所以他是归AbstractRefreshableApplicationContext管理的。上面就说清楚了容器在什么地方了(总结:容器就在ApplicationContext的继承链中的AbstractRefreshableBeanFactory中,它里面有五个ConCurrentHashMap,这就是SpringIoC容器了,所有创建的对象都放在BeanDefinition映射表中)
在AbstractXMLApplicationContext中,(ClassPathXMLApplicationContext的直接父类),存在一个loadBeanDefinition()方法,该方法中,加入了XmlBeanDefinitionReader对象,这个对象中存在一个叫做doLoadBeanDefinitions方法,这个方法可以调用了BeanDefinitionRegistry中的getRegistry方法,将对象的定义读取并保存在继承链中的DefaultListableBeanFactory中,操作过程使用的是父类定义操作,子类调用或用子类定义实现过程来进行内容植入。
总结:
先描述清楚容器在哪里(在ApplicationContext的继承链中有一个DefaultListableBeanFactory对象,它里面有五个ConcurrentHashMap,而真正的bean对象会保存在一个叫做BeanDefinitionMap的映射表中)
怎么放到那个里面的呢?
在ClassPathXMLApplicationContext的直接父类里面有一个loadBeanDefinition()方法,这个方法里面创建了XmlBeanDefinitionReader对象。同时ClassPathXMLApplicationContext又是ResourceLoader的子类。所以ClassPathXMLApplicationContext的直接父类就有同时将配置文件读取到自己对象中的能力(该功能由ResourceLoader提供),而且又有一个XmlBeanDefinitionReader对象(可以将读取出的配置文件的类型的定义映射成一个BeanDefinition),注册成BeanDefinition的能力是由XmlBeanDefinitionReader提供的(将读取到的一条一条bean标签翻译成BeanDefinition)。
XmlBeanDefinitionReader这就是register(注册器),容器就是DefaultListableBeanFactory,这个容器在继承链中放在(AbstractRefreshableApplicationContext)
如何将配置文件读取出:由DefaultResourceLoader提供,在子类中调用的。
怎样将对象创建出来并放到容器中:
第一:先通过资源文件加载器(ResourceLoader)加载资源,他提供找到配置文件,然后把对象翻译到容器对象的功能,由他的实现子类调