Spring 容器--如何创建和加载一个 Spring 容器?

时间:2021-06-12 12:49:29

在基于 Spring 的应用中,你的应用对象生存于 Spring 容器中。

容器是 Spring 框架的核心。Spring 容器使用 DI 管理构成应用的组件,它会创建相互协作的组件之间的关联。

Q:Spring 容器主要负责什么?
A:Spring 容器负责创建对象装配它们,配置它们并管理它们的整个生命周期,从生存到死亡。

Q:Spring自带了哪些容器实现?
A:第一类:bean 工厂是最简单的容器,提供基本的 DI 支持;第二类:应用上下文基于 BeanFactory 构建,并提供应用框架级别的服务。

Q:选择哪一类容器实现?
A:应用上下文。因为 bean 工厂对大多数应用来说往往太低级了,因此,应用上下文要比 bean 工厂更受欢迎。


2.1 使用应用上下文

Spring 自带了多种类型的应用上下文。

  • AnnotationConfigApplicationContext:从一个或多个基于 Java 的配置类中加载 Spring 应用上下文。
  • AnnotationConfigWebApplicationContext:从一个或多个基于 Java 的配置类中加载 Spring Web 应用上下文。
  • ClassPathXmlApplicationContext:从类路径下的一个或多个 XML 配置文件中加载上下文定义,把应用上下文的定义文件作为类资源。
  • FileSystemXmlapplicationcontext:从文件系统下的一个或多个 XML 配置文件中加载上下文定义。
  • XmlWebApplicationContext:从 Web 应用下的一个或多个 XML 配置文件中加载上下文定义。

如何使用?

// 从指定的文件系统路径下,查找 knight.xml 文件
ApplicationContext context = new FileSystemXmlApplicationContext("d:/knight.xml");

// 使用 ClassPathXmlApplicationContext 从应用的类路径下加载应用上下文
ApplicationContext context = new ClassPathXmlApplicationContext("knight.xml");

// 从 Java 配置中加载应用上下文
ApplicationContext context = new AnnotationConfigApplicationContext(com.springinaction.knights.config.KnightConfig.class);

2.2 bean 的生命周期

bean 装载到 Spring 应用上下文中的一个典型的生命周期过程。
Spring 容器--如何创建和加载一个 Spring 容器?

下面进行详细描述:

  1. Spring 对 bean 进行实例化;
  2. Spring 将值和 bean 的引用注入到 bean 对应的属性中;
  3. 如果 bean 实现了 BeanNameAware 接口,Spring 将 bean 的 ID 传递给 setBeanName()方法
  4. 如果 bean 实现了 BeanFactoryAware 接口,Spring 将调用 setBeanFactory()方法,将 BeanFactory 容器实例传入;
  5. 如果 bean 实现了 ApplicationContextAware 接口,Spring 将调用 setApplicationContext()方法,将 bean 所在的应用上下文的引用传入进来;
  6. 如果 bean 实现了 BeanPostProcessor 接口,Spring 将调用它们的 postProcessBeforeInitialization()方法;
  7. 如果 bean 实现了 InitializingBean 接口,Spring 将调用它们的 afterPropertiesSet()方法。类似地,如果 bean 使用 initmethod 声明了初始化方法,该方法也会被调用;
  8. 如果 bean 实现了 BeanPostProcessor 接口,Spring 将调用它们的 postProcessAfterInitialization()方法;
  9. 此时,bean 已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,知道该应用上下文被销毁;
  10. 如果 bean 实现了 DisposableBean 接口,Spring 将调用它的 destory() 接口方法。同样,如果 bean 使用 destroymethod 声明了销毁方法,该方法也会被调用。

上一篇: Spring 是如何简化 Java 开发的?
下一篇:Spring 模块和 Spring Portfolio