1. 初始化ApplicationContext(初始化bean容器, bean容器實際上就是Application擁有的BeanFactory)
new ApplicationContext()的時候。
發生了下面的操做:
BeanDefinitionReader讀取resource裏面指定的bean的xml配置文件。 而且把全部的單例bean存放到
ApplicationContext的BeanFactory的singletonObjects(HashMap結構)字段裏去。
ApplicationContext的BeanFactory的singletonObjects字段就把xml文件中配置的全部的單例bean都存放好了。java
2. 用applicationContext獲取bean
applicationContext.getBean(String beanName)
其實是app
Object bean = applicationContext.getBeanFactory.getBean(String beanName);
AbstractBeanFactory繼承了DefaultSingletonBeanRegistry裏面有一個ConcurrentHashMap類型的singletonObjects來存放全部的已經被註冊了的單例bean
(key是beanName,value是bean對象)this
/** Cache of singleton objects: bean name --> bean instance */ private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256);
BeanFactory.getBean(), 若是是單例的,會調用這個方法,從singletonObjects中獲取到對應的bean.code
protected Object getSingleton(String beanName, boolean allowEarlyReference) { Object singletonObject = this.singletonObjects.get(beanName); }
singletonObject被返回。這就是獲取到的bean
xml