ApplicationContext 容器

David 2022-06-28 15:48:37
Categories: Tags:
  • ApplicationContext Spring 的一个核心接口或容器,用于管理应用程序中的所有 bean 对象,并负责实例化,配置和组装 Bean

 

container magic

 

  • ApplicationContext 容器通过读取配置元数据(xml配置)来获取有关要实例化,配置和组装哪些对象的指令。配置元数据以 XMLJava 注解或 Java 代码指定。基于 XML 的配置元数据将这些 bean 配置为顶级 <beans/> 元素内的 <bean/> 元素。 Java 注解配置通常在 @Configuration 类中使用 @Bean

注解的方法。

 

 

  • ApplicationContext BeanFactory 的子接口。它增加了:

 

  1. Spring AOP 功能轻松集成

 

  1. 消息资源处理 (用于国际化)

 

  1. Event publication

 

  1. 特定于应用程序层的上下文,例如用于 Web 应用程序的 WebApplicationContext

 

  • 同时 ApplicationContext 继承了多个类,可以使用其所有方法,并实现了以下方法:

方法

说明

getId()

此应用程序上下文的唯一id

getApplicationName()

此上下文所属的已部署应用程序的名称。

getDisplayName()

此上下文的友好名称。

getStartupDate()

首次加载此上下文时的时间戳。

getParent()

返回父上下文,如果没有父上下文并且这是上下文层次结构的根,则返回 Null

getAutowireCapableBeanFactory()

公开此上下文的AutowireCapableBeanFactory功能

 

  • ApplicationContext 可以从 XML 文件、注解或 Java 代码中加载bean定义,允许容器通过应用程序上下文环境创建、获取、管理 bean

 

 

 

创建容器

  • 程序主要是通过Spring容器来访问容器中的<Bean>ApplicationContextSpring容器最常用的接口,该接口有如下两个实现类:

 

  • 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();

}