1.BeanFactory和ApplicationContext的異同點:
相同點:
兩者都是通過xml配置文件加載bean,ApplicationContext和BeanFacotry相比,提供了更多的擴展功能。
不同點:
BeanFactory是延遲加載,如果Bean的某一個屬性沒有注入,BeanFacotry加載后,直至第一次使用調用getBean方法才會拋出異常;而ApplicationContext則在初始化自身是檢驗,這樣有利於檢查所依賴屬性是否注入;所以通常情況下我們選擇使用ApplicationContext
2.在實際開發中用BeanFactory還是ApplicationContext
ApplicationContext包含BeanFactory的所有功能。通常建議比BeanFactory優先,除非有一些限制的場合如字節長度對內存有很大的影響時(Applet)。然后,絕大多數"典型的"企業應用和系統,ApplicationContext就是你需要使用的。Spring2.0及以上版本,大量使用了link linkend="beans-factory-extension-bpp">BeanPostProcessor擴展(以便應用代理等功能),如果你選擇BeanFactory則無法使用相當多的支持功能,如事務和AOP,這可能會導致混亂,因為配置並沒有錯誤。
3.一個簡單的例子來證明BeanFactory和ApplicationContext主要區別
搭建工程的環境就不說了,直接上代碼。
1.首先創建一個實體類:User
public class User { public User(){ System.out.println("實例化User"); } }
2.在創建一個ApplicationContext.xml文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="user" class="cn.test.User"></bean> </beans>
3.創建測試類
public class TestHappy { /** * BeanFactory的測試 */ @Test public void beanFactoryTest(){ BeanFactory beanFactory=new XmlBeanFactory(new ClassPathResource("applicationContext.xml")); } /** * ApplicationContext的測試 */ @Test public void applicationContextTest(){ ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); } }
BeanFactory測試結果:

ApplicationContext測試結果:

總結:
BeanFactory當需要調用時讀取配置信息,生成某個類的實例。如果讀入的Bean配置正確,則其他的配置中有錯誤也不會影響程序的運行。而ApplicationContext 在初始化時就把 xml 的配置信息讀入內存,對 XML 文件進行檢驗,如果配置文件沒有錯誤,就創建所有的Bean ,直接為應用程序服務。相對於基本的BeanFactory,ApplicationContext 唯一的不足是占用內存空間。當應用程序配置Bean較多時,程序啟動較慢。
