- ApplicationContext 是 Spring 的一个核心接口或容器,用于管理应用程序中的所有 bean 对象,并负责实例化,配置和组装 Bean
- ApplicationContext 容器通过读取配置元数据(xml配置)来获取有关要实例化,配置和组装哪些对象的指令。配置元数据以 XML,Java 注解或 Java 代码指定。基于 XML 的配置元数据将这些 bean 配置为顶级 <beans/> 元素内的 <bean/> 元素。 Java 注解配置通常在 @Configuration 类中使用 @Bean
注解的方法。
- ApplicationContext 是 BeanFactory 的子接口。它增加了:
- 与 Spring 的 AOP 功能轻松集成
- 消息资源处理 (用于国际化)
- Event publication
- 特定于应用程序层的上下文,例如用于 Web 应用程序的 WebApplicationContext。
- 同时 ApplicationContext 继承了多个类,可以使用其所有方法,并实现了以下方法:
方法 |
说明 |
getId() |
此应用程序上下文的唯一id。 |
getApplicationName() |
此上下文所属的已部署应用程序的名称。 |
getDisplayName() |
此上下文的友好名称。 |
getStartupDate() |
首次加载此上下文时的时间戳。 |
getParent() |
返回父上下文,如果没有父上下文并且这是上下文层次结构的根,则返回 Null |
getAutowireCapableBeanFactory() |
公开此上下文的AutowireCapableBeanFactory功能 |
- ApplicationContext 可以从 XML 文件、注解或 Java 代码中加载bean定义,允许容器通过应用程序上下文环境创建、获取、管理 bean。
创建容器
- 程序主要是通过Spring容器来访问容器中的<Bean>,ApplicationContext是Spring容器最常用的接口,该接口有如下两个实现类:
- ClassPathXmlApplicationContext (常用)
从类加载路径下搜索配置文件,并根据配置文件来创建Spring容器。
- FileSystemXmlApplicationContext
从文件系统的相对路径或绝对路径下去搜索配置文件,并根据配置文件来创建Spring容器。
- 容器对象(ApplicationContext)创建时,读取配置文件, 一次创建好所有的java对象, 都放到map中
- 默认是无参构造创建对象,如果定义了有参构造,无参构造应当保留,否则出错
示例
//ClassPathXmlApplicationContext
public class BeanTest{
public
static void main(String args[]) throws Exception{
String config = "applicationContext.xml";
ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
Person p =
ctx.getBean("person");
p.say();
}
//FileSystemXmlApplicationContext
public static void main(String args[]) throws Exception{
String config = "applicationContext.xml";
ApplicationContext ctx = new FileSystenXmlApplicationContext(config);
//ApplicationContext ctx = new FileSystenXmlApplicationContext("applicationContext.xml");
Person
p = ctx.getBean("person");
p.say();
}
}
获取对象
- ApplicationContext的属性和方法
方法 |
描述 |
getBean("id") |
根据id获取对象 |
getBean(java.class) |
根据类名获取对象 |
getBeanDefinitionCount() |
获取容器中的对象的数量,返回int类型 |
getBeanDefinitionNames() |
获取容器中的所有的对象名称,返回字符串数组 |
示例
- getBean("id")
//载入配置文件
String config="applicationContext.xml";
//创建容器对象
ApplicationContext ctx= new ClassPathXmlApplicationContext(config);
//使用id取出容器中的对象,后进行强制转型,速度偏慢
UserService service= (UserService) ctx.getBean("userService");
//调用对象的方法
service.count();
- getBean(java.class)
//载入配置文件
String config="applicationContext.xml";
//创建容器对象
ApplicationContext ctx= new ClassPathXmlApplicationContext(config);
//使用类名直接取出容器中的对象,因为对象已经创建,取出速度更快,占内存
UserService service= ctx.getBean(UserService.class);
//调用对象的方法
service.count();
关闭容器
- 在 Spring 中 ConfigurableApplicationContext 及其子类接口提供了以下方法关闭容器:
方法 |
说明 |
close() |
显式地关闭应用程序上下文的方式。当调用close()方法时,Spring将销毁应用程序上下文中的所有bean,并释放所有相关的资源。在这种情况下,Spring不会等待JVM关闭钩子触发,而是立即关闭应用程序上下文。 |
registerShutdownHook() |
一种注册JVM关闭钩子的方式。当JVM关闭时,JVM关闭钩子会被触发,并自动关闭应用程序上下文。在这种情况下,Spring会等待JVM关闭钩子触发,并在触发时关闭应用程序上下文。 |
- 通常情况下,建议使用 registerShutdownHook() 方法来关闭应用程序上下文,因为这样可以确保在 JVM 关闭时正确地关闭应用程序上下文。但是,在某些情况下,可能需要使用 close() 方法来显式地关闭应用程序上下文。例如,在某些 Web 应用程序中,可能需要在 Web 容器关闭之前显式地关闭应用程序上下文。
示例
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
…
// ((ClassPathXmlApplicationContext) context).close();
((ConfigurableApplicationContext) context).close();
}
示例
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
…
// ((ClassPathXmlApplicationContext) context).registerShutdownHook();
((ConfigurableApplicationContext) context).registerShutdownHook();
}