//從ApplicationContext 中取 bean ApplicationContext ac = new ClassPathXmlApplicationContext ( "com/hsp/beans.xml" ) ; ac.getBean("beanId");
當我們去實例化beans.xml,該文件中配置的 bean 就被實例化(不論你用還是不用,bean對象都在那),而且該對象是singleton單例的。(每個bean都有scope屬性,可以人為的設置任意的bean為單態的,scope="singleton",scope="prototype"則每獲得一個bean都是全新的bean)。
優點:預先加載,使用的時候速度快。
缺點:耗內存,所有的bean都被實例化了,但是可能只用到其中的很少。
//從bean工廠取bea n BeanFactory factory = new XmlBeanFactory( new ClassPathResource ( "com/hsp/beans.xml" ) ) ; factory.getBean("beanId");
如果使用 BeanFactory 去取bean ,當你只是實例化該容器,那么容器里的 beans 不會馬上被實例化,只有當你使用getBean某個bean時,才會實時的創建。
優點:節約內存。
缺點:速度慢。
關於選擇:只有在移動項目里使用beanfactory,大多數項目(90%)使用的都是ApplicationContext,因為可以提前加載,只是浪費點內存。
有一點需要注意,用ApplicationContext實例化xml里的bean默認都是singleton單例的。也就是說每個bean都只有一個實例對象,不論調用多少次getBean()方法,不論有多少 ref 依賴,spring容器中都只有一個bean實例。 但是當人為設置它的scope="prototype"的時候,它就不是單例了,而且在加載xml文件的時候也不會實例化了(因為當你把它設置為prototype原型的時候,spring框架不知道你需要對這個bean創建多少個實例,所以它索性就不實例了)。
附上Spring API對 Spring bean 作用域的解釋:
Bean簡介: 在Spring中,那些組成你應用程序的主體(backbone)及由Spring IoC容器所管理的對象,被稱之為bean。 簡單地講,bean就是由Spring容器初始化、裝配及管理的對象,除此之外,bean就與應用程序中的其他對象沒有什么區別了。 而bean定義以及bean相互間的依賴關系將通過配置元數據來描述。 Bean的作用域: 創建一個bean定義,其實質是用該bean定義對應的類來創建真正實例的“配方(recipe)”。把bean定義看成一個配方很有意義,它與class很類似,只根據一張“處方”就可以創建多個實例。 你不僅可以控制注入到對象中的各種依賴和配置值,還可以控制該對象的作用域。這樣你可以靈活選擇所建對象的作用域,而不必在Java Class級定義作用域。Spring Framework支持五種作用域(其中后三種屬性只能用在基於web的Spring ApplicationContext,singgleton、prototype可以用於桌面開發)。 1、singleton:當一個bean的作用域為singleton, 那么Spring IoC容器中只會存在一個共享的bean實例,並且所有對bean的請求,只要id與該bean定義相匹配,則只會返回bean的同一實例。 注意:Singleton作用域是Spring中的缺省作用域。要在XML中將bean定義成singleton,可以這樣配置: <bean id="empServiceImpl" class="cn.csdn.service.EmpServiceImpl" scope="singleton"> 2、prototype:一個bean定義對應多個對象實例。Prototype作用域的bean會導致在每次對該bean請求(將其注入到另一個bean中,或者以程序的方式調用容器的getBean()方法)時都會創建一個新的bean實例。
根據經驗,對有狀態的bean應該使用prototype作用域,而對無狀態的bean則應該使用singleton作用域。
