Spring 容器(Spring 上下文)是生成 Bean 實例的工廠嫡丙,負責(zé)配置鸠珠、創(chuàng)建并管理容器中的 Bean 怕犁,包括 Bean 的生命周期
Spring 容器的接口有:BeanFactory 接口和 ApplicationContext 接口紫新,其中 ApplicationContext 接口是 BeanFactory 接口的子接口,它們之間的區(qū)別為:Spring中ApplicationContext和beanfactory區(qū)別但绕,通常使用 ApplicationContext 接口作為 Spring 的容器
ApplicationContext 相較于 BeanFactory 的優(yōu)點有:
- 允許聲明式創(chuàng)建啟動容器。如在 Web 應(yīng)用中利用 ContextLoader 支持類在 Web 應(yīng)用啟動時自動創(chuàng)建 ApplicationContext
- 繼承 MessageSource 接口,因而提供國際化支持
- 資源訪問捏顺。如 URL 和 文件
- 事件機制
- 載入多個配置文件
ApplicationContext 的 架構(gòu):Spring context架構(gòu)--靜態(tài)結(jié)構(gòu)
Spring 容器的實現(xiàn)類有:
- BeanFactory :
- XmlBeanFactory
- ApplicationContext :
- FileSystemXmlApplicationContext
- ClassPathXmlApplicationContext
- AnnotationConfigApplicationContext
- XmlWebApplicationContext (在 Web 應(yīng)用中使用的容器)
- AnnotationConfigWebApplicationContext (在 Web 應(yīng)用中使用的容器)
實例化容器:
//利用FileSystemResource讀取配置文件
Resource r = new FileSystemResource("applicationContext.xml");
//利用XmlBeanFactory來加載配置文件六孵,啟動IOC容器
BeanFactory f = new XmlBeanFactory(r);
//加載 classpath 下的 applicationContext.xml 文件創(chuàng)建 Resource 對象
ClassPathResoure r = new ClassPathResoure("applicationContext.xml");
//利用XmlBeanFactory來加載配置文件,啟動IOC容器
BeanFactory f = new XmlBeanFactory(r);
ApplicationContext appContext = new ClassPathXmlApplicationContext(new String[] {"applicationContext1.xml", applicationContext2.xml});
從 IOC 容器中獲取 Bean 實例
Person person = (Person) f.getBean("person");
為 Spring 容器注冊關(guān)閉鉤子幅骄〗僦希可保證 Spring 容器被恰當?shù)年P(guān)閉,并自動執(zhí)行 singleton Bean 的析構(gòu)回調(diào)方法
f.registerShutdownHook();
ApplicationContext 的事件機制
通過 ApplicationEvent 類和 ApplicationListener 接口拆座,可以實現(xiàn) ApplicationContext 事件處理
ApplicationEvent 指容器事件主巍,由 ApplicationContext 發(fā)布(即在 Java 程序中顯式觸發(fā))
ApplicationEvent 類的實現(xiàn)類不需實現(xiàn)任何方法
public class EmailEvent extends ApplicationEvent {
public String address;
public Strint text;
// 省略 getter 和 setter
}
容器事件的監(jiān)聽器必須實現(xiàn) ApplicationListener 接口,實現(xiàn)接口方法 onApplicationEvent(ApplicationEvent event)
挪凑,當容器內(nèi)發(fā)生任何事件孕索,此方法被觸發(fā)
public class EmailListener implements ApplicationListener {
public void onApplicationEvent(ApplicationEvent event) {
...
}
}
將監(jiān)聽器配置在 Spring xml 配置文件中
<bean class="com.lian.listener.EmailListener"/>
容器事件的觸發(fā)時機:
- 系統(tǒng)創(chuàng)建 Spring 容器
- 加載 Spring 容器
- 程序調(diào)用 ApplicationContext 的 publishEvent() 方法主動觸發(fā)
... EmailEvent event = new EmailEvent(); context.publishEvent(event);
- 銷毀前
Spring 的內(nèi)置事件有:
- ContextRefreshedEvent
ApplicationContext 初始化(指所有 Bean 被成功加載,后處理器 Bean 被檢測并激活躏碳,所有 Singleton Bean 被預(yù)實例化搞旭,ApplicationContext 已就緒可用)或刷新觸發(fā)該事件 - ContextStartedEvent
當使用 ConfigurableApplicationContext 接口的 start() 方法啟動 ApplicationContext 容器時觸發(fā)該事件 - ContextClosedEvent
當使用 ConfigurableApplicationContext 接口的 close() 方法關(guān)閉 ApplicationContext 容器時觸發(fā)該事件 - ContextStoppedEvent
當使用 ConfigurableApplicationContext 接口的 stop() 方法停止(容器可用 start() 方法重新啟動) ApplicationContext 容器時觸發(fā)該事件 - RequestHandledEvent
Web 相關(guān)事件,只能應(yīng)用于使用 DispatcherServlet 的 Web 應(yīng)用(當使用 SpringMVC 時菇绵,當 Spring 處理用戶請求結(jié)束后肄渗,觸發(fā)該事件)