1.從ApplicationContext中取bean web
ApplicationContext ac = new ClassPathXmlApplicationContext("/com/bean.xml"); 緩存
當咱們實例化bean.xml時,該文件中配置的bean都會被實例化。(該bean scope是singleton)prototype
2. 從BeanFactory中取beanxml
BeanFactory factory= new XmlBeanFactory(new ClassPathResource("/com/bean.xml"));對象
factory.getBean("student"); //取bean的時候纔會實例化內存
當使用beanfactory去獲取bean,當你只是實例化該容器,那麼容器內的bean不會被實例化,只有當使用某個bean(getBean)時,纔會實時去實例化該bean。開發
總結get
1.若是使用ApplicationContext,則配置的bean若是是singleton無論你用仍是不用,都被實例化。好處是能夠預先加載,壞處是浪費內存。it
2.BeanFactory,當使用BeanFactory實例化對象時,配置的bean不會立刻被實例化。當你使用該bean時纔會被實例化(getBean)。好處是節約內存,缺點是速度比較慢。多用於移動設備的開發上。io
3.通常沒有特殊要求,應當使用ApplicationContext完成。
3. 三種獲取ApplicationContext對象引用的方法
1.ClassPathXmlApplicationContext 經過類路徑。
2.FileSystemXmlApplicationContext 經過文件路徑。
ApplicationContext ac = FileSystemXmlApplicationContext("d:\\com\\bean.xml");
3.XmlWebApplicationContext:從web系統中加載。
4. 問題在於:bean是什麼時候被加載的?
首先要分2種狀況
第一:若是你使用BeanFactory做爲Spring Bean的工廠類,則全部的bean都是在第一次使用該Bean的時候實例化
第二:若是你使用ApplicationContext做爲Spring Bean的工廠類,則又分爲如下幾種狀況: (1):若是bean的scope是singleton的,而且lazy-init爲false(默認是false,因此能夠不用設置),則 ApplicationContext啓動的時候就實例化該Bean,而且將實例化的Bean放在一個map結構的緩存中,下次再使用該Bean的時候, 直接從這個緩存中取 (2):若是bean的scope是singleton的,而且lazy-init爲true,則該Bean的實例化是在第一次使用該Bean的時候進行實例化 (3):若是bean的scope是prototype的,則該Bean的實例化是在第一次使用該Bean的時候進行實例化