Spring容器中Bean的创建
- 目标:Spring容器中的Bean是如何创建的?为什么能从容器中获取到?
探究过程
1 | public class Demo { |
1 | public ClassPathXmlApplicationContext(String configLocation) throws BeansException { |
1 | public void preInstantiateSingletons() throws BeansException { |
1 | public <T> T getBean(String name, Class<T> requiredType) throws BeansException { |
1 | protected <T> T doGetBean(String name, boolean typeCheckOnly) Class<T> requiredType, Object[] args, throws BeansException { |
1 | public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) { |
1 | Student student = (Student)app.getBean("student"); |
- 结论:非懒加载的单例实例bean会在容器创建的时候创建,容器内部会创建一个beanFactory,使用beanFactory的doGetBean方法来通过反射进行创建,并且在创建后会把bean放入一个单例bean的Map集合中存储。key就是我们配置的bean的名称。所以我们调用容器的getBean方法来获取对象的时候,其实它也是调用了doGetBean方法。就会从对应的集合中获取到之前创建的对象。
- 疑问:RootBeanDefinition是什么?是怎么bean名获取对应的RootBeanDefinition对象的;如果是FactoryBean是怎么创建的