Spring 容器(Spring 上下文)是生成 Bean 实例的工厂,负责配置、创建并管理容器中的 Bean ,包括 Bean 的生命周期
Spring 容器的接口有:BeanFactory 接口和 ApplicationContext 接口,其中 ApplicationContext 接口是 BeanFactory 接口的子接口,它们之间的区别为:Spring中ApplicationContext和beanfactory区别,通常使用 ApplicationContext 接口作为 Spring 的容器
ApplicationContext 相较于 BeanFactory 的优点有:
- 允许声明式创建启动容器。如在 Web 应用中利用 ContextLoader 支持类在 Web 应用启动时自动创建 ApplicationContext
- 继承 MessageSource 接口,因而提供国际化支持
- 资源访问。如 URL 和 文件
- 事件机制
- 载入多个配置文件
ApplicationContext 的 架构:Spring context架构--静态结构
Spring 容器的实现类有:
- BeanFactory :
- XmlBeanFactory
- ApplicationContext :
- FileSystemXmlApplicationContext
- ClassPathXmlApplicationContext
- AnnotationConfigApplicationContext
- XmlWebApplicationContext (在 Web 应用中使用的容器)
- AnnotationConfigWebApplicationContext (在 Web 应用中使用的容器)
实例化容器:
//利用FileSystemResource读取配置文件
Resource r = new FileSystemResource("applicationContext.xml");
//利用XmlBeanFactory来加载配置文件,启动IOC容器
BeanFactory f = new XmlBeanFactory(r);
//加载 classpath 下的 applicationContext.xml 文件创建 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 容器注册关闭钩子。可保证 Spring 容器被恰当的关闭,并自动执行 singleton Bean 的析构回调方法
f.registerShutdownHook();
ApplicationContext 的事件机制
通过 ApplicationEvent 类和 ApplicationListener 接口,可以实现 ApplicationContext 事件处理
ApplicationEvent 指容器事件,由 ApplicationContext 发布(即在 Java 程序中显式触发)
ApplicationEvent 类的实现类不需实现任何方法
public class EmailEvent extends ApplicationEvent {
public String address;
public Strint text;
// 省略 getter 和 setter
}
容器事件的监听器必须实现 ApplicationListener 接口,实现接口方法 onApplicationEvent(ApplicationEvent event)
,当容器内发生任何事件,此方法被触发
public class EmailListener implements ApplicationListener {
public void onApplicationEvent(ApplicationEvent event) {
...
}
}
将监听器配置在 Spring xml 配置文件中
<bean class="com.lian.listener.EmailListener"/>
容器事件的触发时机:
- 系统创建 Spring 容器
- 加载 Spring 容器
- 程序调用 ApplicationContext 的 publishEvent() 方法主动触发
... EmailEvent event = new EmailEvent(); context.publishEvent(event);
- 销毁前
Spring 的内置事件有:
- ContextRefreshedEvent
ApplicationContext 初始化(指所有 Bean 被成功加载,后处理器 Bean 被检测并激活,所有 Singleton Bean 被预实例化,ApplicationContext 已就绪可用)或刷新触发该事件 - ContextStartedEvent
当使用 ConfigurableApplicationContext 接口的 start() 方法启动 ApplicationContext 容器时触发该事件 - ContextClosedEvent
当使用 ConfigurableApplicationContext 接口的 close() 方法关闭 ApplicationContext 容器时触发该事件 - ContextStoppedEvent
当使用 ConfigurableApplicationContext 接口的 stop() 方法停止(容器可用 start() 方法重新启动) ApplicationContext 容器时触发该事件 - RequestHandledEvent
Web 相关事件,只能应用于使用 DispatcherServlet 的 Web 应用(当使用 SpringMVC 时,当 Spring 处理用户请求结束后,触发该事件)