目录
导语:
一、Spring Bean的生命周期概述
1.1Spring 容器中 Bean 的生命周期流程
1.2Spring Bean的生命周期可以分为以下几个阶段:
二、Spring Bean的生命周期详解
2.1实例化
2.2初始化
2.3销毁
三、总结
导语:
在使用Spring框架进行Java应用程序开发时,理解Spring Bean的生命周期是至关重要的。Spring框架提供了强大的依赖注入功能,使得开发者可以通过配置文件或注解将Bean管理交给Spring容器。本文将详细介绍Spring Bean的生命周期,涵盖了从实例化到销毁的整个过程。
一、Spring Bean的生命周期概述
Spring 容器可以管理 singleton 作用域 Bean 的生命周期,在此作用域下,Spring 能够精确地知道该 Bean 何时被创建,何时初始化完成,以及何时被销毁。
而对于 prototype 作用域的 Bean,Spring 只负责创建,当容器创建了 Bean 的实例后,Bean 的实例就交给客户端代码管理,Spring 容器将不再跟踪其生命周期。每次客户端请求 prototype 作用域的 Bean 时,Spring 容器都会创建一个新的实例,并且不会管那些被配置成 prototype 作用域的 Bean 的生命周期。
了解 Spring 生命周期的意义就在于,可以利用 Bean 在其存活期间的指定时刻完成一些相关操作。这种时刻可能有很多,但一般情况下,会在 Bean 被初始化后和被销毁前执行一些相关操作。
1.1Spring 容器中 Bean 的生命周期流程
如果 BeanFactoryPostProcessor 和 Bean 关联, 则调用postProcessBeanFactory方法.(即首先尝试从Bean工厂中获取Bean)
如果 InstantiationAwareBeanPostProcessor 和 Bean 关联,则调用postProcessBeforeInstantiation方法
根据配置情况调用 Bean 构造方法实例化 Bean。
利用依赖注入完成 Bean 中所有属性值的配置注入。
如果 InstantiationAwareBeanPostProcessor 和 Bean 关联,则调用postProcessAfterInstantiation方法和postProcessProperties
调用xxxAware接口 (上图只是给了几个例子)
1.第一类Aware接口
如果 Bean 实现了 BeanNameAware 接口,则 Spring 调用 Bean 的 setBeanName() 方法传入当前 Bean 的 id 值。
如果 Bean 实现了 BeanClassLoaderAware 接口,则 Spring 调用 setBeanClassLoader() 方法传入classLoader的引用。
如果 Bean 实现了 BeanFactoryAware 接口,则 Spring 调用 setBeanFactory() 方法传入当前工厂实例的引用。
2.第二类Aware接口
如果 Bean 实现了 EnvironmentAware 接口,则 Spring 调用 setEnvironment() 方法传入当前 Environment 实例的引用。
如果 Bean 实现了 EmbeddedValueResolverAware 接口,则 Spring 调用 setEmbeddedValueResolver() 方法传入当前 StringValueResolver 实例的引用。
如果 Bean 实现了 ApplicationContextAware 接口,则 Spring 调用 setApplicationContext() 方法传入当前 ApplicationContext 实例的引用。
如果 BeanPostProcessor 和 Bean 关联,则 Spring 将调用该接口的预初始化方法 postProcessBeforeInitialzation() 对 Bean 进行加工操作,此处非常重要,Spring 的 AOP 就是利用它实现的。
如果 Bean 实现了 InitializingBean 接口,则 Spring 将调用 afterPropertiesSet() 方法。(或者有执行@PostConstruct注解的方法)
如果在配置文件中通过 init-method 属性指定了初始化方法,则调用该初始化方法。
如果 BeanPostProcessor 和 Bean 关联,则 Spring 将调用该接口的初始化方法 postProcessAfterInitialization()。此时,Bean 已经可以被应用系统使用了。
如果在 <bean> 中指定了该 Bean 的作用范围为 scope="singleton",则将该 Bean 放入 Spring IoC 的缓存池中,将触发 Spring 对该 Bean 的生命周期管理;如果在 <bean> 中指定了该 Bean 的作用范围为 scope="prototype",则将该 Bean 交给调用者,调用者管理该 Bean 的生命周期,Spring 不再管理该 Bean。
如果 Bean 实现了 DisposableBean 接口,则 Spring 会调用 destory() 方法将 Spring 中的 Bean 销毁;(或者有执行@PreDestroy注解的方法)
如果在配置文件中通过 destory-method 属性指定了 Bean 的销毁方法,则 Spring 将调用该方法对 Bean 进行销毁
1.2Spring Bean的生命周期可以分为以下几个阶段:
实例化(Instantiation):Spring容器根据配置信息或注解创建Bean的实例。
属性赋值(Population):Spring容器通过依赖注入或其他方式设置Bean的属性。
初始化(Initialization):Spring容器调用Bean的初始化方法进行一些额外的配置和初始化操作。
使用(In Use):Bean可用于执行业务逻辑,处理请求等操作。
销毁(Destruction):当容器关闭或Bean被销毁时,Spring容器调用Bean的销毁方法进行清理工作。
二、Spring Bean的生命周期详解
2.1实例化
在这个阶段,Spring容器根据配置文件或注解创建Bean的实例。一般有两种实例化方式:
通过构造函数实例化:Spring使用Bean的构造函数创建Bean的实例。
通过工厂方法实例化:Spring使用静态工厂方法或实例工厂方法创建Bean的实例。
public class MyBean { private String name; public void setName(String name) { this.name = name; } // other methods }
2.2初始化
1.在这个阶段,Spring容器调用Bean的初始化方法进行一些额外的配置和初始化操作。有两种方式定义初始化方法:
- XML配置:使用init-method属性指定初始化方法。
- 注解:使用@PostConstruct注解标注初始化方法。
public class MyBean { private String name; public void init() { // Initialization logic } // other methods }
2.3销毁
1.在这个阶段,当容器关闭或Bean被销毁时,Spring容器调用Bean的销毁方法进行清理工作。有两种方式定义销毁方法:
- XML配置:使用destroy-method属性指定销毁方法。
- 注解:使用@PreDestroy注解标注销毁方法。
public class MyBean { private String name; public void destroy() { // Destruction logic } // other methods }
三、总结
Spring Bean的生命周期包括实例化、属性赋值、初始化、使用和销毁等阶段。通过深入了解Bean的生命周期,开发者可以更好地理解和使用Spring框架,充分发挥依赖注入和Bean管理的优势。在实际开发中,可以通过配置文件或注解来定义Bean的初始化方法和销毁方法,以满足特定的业务需求。
希望本文对读者理解Spring Bean的生命周期提供了帮助。通过掌握Bean的生命周期,能够更好地使用Spring框架构建可扩展、可维护的Java应用程序。