spring中bean的加載時間

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的時候進行實例化

相關文章
相關標籤/搜索