相同:
- Spring提供了兩種不同的IOC 容器,一個是BeanFactory,另外一個是ApplicationContext,它們都是Java interface,ApplicationContext繼承於BeanFactory(ApplicationContext繼承ListableBeanFactory。
- 它們都可以用來配置XML屬性,也支持屬性的自動注入。
- 而ListableBeanFactory繼承BeanFactory),BeanFactory 和 ApplicationContext 都提供了一種方式,使用getBean("bean name")獲取bean。
BeanFactory 獲取bean注冊信息
public class HelloWorldApp{
public static void main(String[] args) {
XmlBeanFactory factory = new XmlBeanFactory (new ClassPathResource("beans.xml"));
HelloWorld obj = (HelloWorld) factory.getBean("helloWorld");
obj.getMessage();
}
}
ApplicationContext 獲取bean注冊信息
public class HelloWorldApp{
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");
HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
obj.getMessage();
}
}
但是他們在工作和特性上有一些不同:
- 當你調用getBean()方法時,BeanFactory僅實例化bean,而ApplicationContext 在啟動容器的時候實例化單例bean,不會等待調用getBean()方法時再實例化。
- BeanFactory不支持國際化,即i18n,但ApplicationContext提供了對它的支持。
- BeanFactory與ApplicationContext之間的另一個區別是能夠將事件發布到注冊為監聽器的bean。
- BeanFactory 的一個核心實現是XMLBeanFactory 而ApplicationContext 的一個核心實現是ClassPathXmlApplicationContext,Web容器的環境我們使用WebApplicationContext並且增加了getServletContext 方法。
- 如果使用自動注入並使用BeanFactory,則需要使用API注冊AutoWiredBeanPostProcessor,如果使用ApplicationContext,則可以使用XML進行配置。
- 簡而言之,BeanFactory提供基本的IOC和DI功能,而ApplicationContext提供高級功能,BeanFactory可用於測試和非生產使用,但ApplicationContext是功能更豐富的容器實現,應該優於BeanFactory