logo头像
Snippet 博客主题

Spring容器以及Bean的生命周期

本文于542天之前发表,文中内容可能已经过时

Spring容器

容器是Spring框架的核心.Spring容器使用DI管理构成应用的组件,他会创建相互协作的组件之间的关联.
Spring容器并不是只有一个.Spring自带多个容器实现,可归纳为两种不同的类型:

  • Bean工厂(由BeanFactory接口定义)是最简单的同期,提供基本的DI支持.
  • 应用上下文(由ApplicationContext接口定义)基于BeanFactory构建,并提供应用框架级别的服务.

虽然我们可以在Bean工厂和应用上下文任选一种作为我们的容器,但BeanFactory是ApplicationContext的顶层接口,功能比较少,不能满足我们日常应用的需求.因此应用上下文更受大家的欢迎.

Spring自带了多种类型的应用上下文,下面罗列几个常用的:

  • AnnotationConfigApplicationContext:从一个或多个基于Java的配置类中加载Spring应用上下文.Spring4之后推荐使用,Spring Boot,Spring Cloud等自动配置都是基于Java Config.
  • AnnotationConfigWebApplicationContext:从一个或多个基于Java的配置类中加载Spring Web上下文.
  • ClassPathXmlApplicationContext: 从classpath路径下的一个或多个XML配置加载上下文.Spring 4之前常常以classpath下文件方式进行加载.
  • FileSystemXmlApplicationContext: 从文件系统下的一个或多个XML配置文件中加载上下文定义.一般不用
  • XmlWebApplicationContext: 从Web应用下的一个或多个XML配置加载上下文.以前老的Web项目常用的加载方式.

Bean的生命周期

在传统的Java编程模式中,使用Java对象关键字new或者利用反射机制进行对象实例化,这些”Bean”实例化后方可使用.到了某个时期这些对象不再被使用了,则JVM会自动进行垃圾回收.

相比传统Java对象的生命周期,Spring容器中Bean的生命周期就显得相对复杂多了.正确理解Spring Bean的生命周期非常重要,因为你或许要利用Spring提供的扩展点来自动鬼Bean的创建过程.
Bean的生命周期图解

如上图,Bean在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()方法.类似在xml使用了init-method的方法,该方法也会被调用.
  8. 如果Bean实现了BeanPostProcessor接口,Spring将调用postProcessAfterInitialization()方法.
  9. Bean已经准备就绪,可以被应用程序使用了,它们一直驻留在应用上下文中,直到该应用上下文被销毁.
  10. 如果Bean实现了DisposableBean接口,Spring将调用它的destroy()方法.类似地,如果在xml使用了destroy-method声明了销毁方法,该方法也会被调用.
支付宝打赏 微信打赏

请作者喝杯咖啡吧