在 Spring Bean 的生命周期可以分为四个阶段,下面我就来分别详解Spring Bean生命周期@mikechen
1.实例化阶段
这个阶段主要是实例化 Bean 对象,使用 Bean 的构造函数或者工厂方法来实例化 Bean 对象。
首先当 Spring 容器启动时,会按照配置文件中定义的 Bean 信息,通过反射机制实例化每一个 Bean 对象,即调用它的构造方法来创建一个新的实例。
如下图所示:
源码所示:
- // 创建 Bean 实例
- protected <T> T doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) {
- // 实例化 Bean
- BeanWrapper instanceWrapper = null;
- if (mbd.isSingleton()) {
- instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
- }
- if (instanceWrapper == null) {
- instanceWrapper = createBeanInstance(beanName, mbd, args);
- }
备注:这个阶段 Bean 对象还没有被初始化。
2.属性赋值阶段
在属性赋值阶段,Spring 会为 Bean 的属性赋值,这个阶段可以通过注入 Bean 的属性来实现,也可以使用 XML 配置文件、注解等方式来实现。
如下图所示:
源码所示:
- // XML 配置文件方式
- public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessor implements BeanDefinition, Cloneable {
- // Bean 属性
- private final MutablePropertyValues propertyValues = new MutablePropertyValues();
- public void setPropertyValues(PropertyValues propertyValues) {
- this.propertyValues.clear();
- if (propertyValues != null) {
- this.propertyValues.addPropertyValues(propertyValues);
- }
- }
- }
- // 注解方式
- public interface Autowired {
- boolean required() default true;
- }
- @Autowired(required = true)
- private UserDao userDao;
3.初始化阶段
在这个阶段,Spring 会调用 Bean 的初始化方法,Bean 的初始化方法可以通过配置文件中的 init-method 属性或者实现 InitializingBean 接口来定义。
- InitializingBean 接口:可以让 Bean 实现 InitializingBean 接口,并实现 afterPropertiesSet() 方法来执行初始化操作。
- init-method 属性:可以通过配置文件中的 init-method 属性来指定 Bean 的初始化方法。
如下图所示:
源码所示:
- // InitializingBean 接口方式
- public interface InitializingBean {
- void afterPropertiesSet() throws Exception;
- }
- // 调用 InitializingBean 的 afterPropertiesSet 方法
- protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd) throws Throwable {
- boolean isInitializingBean = (bean instanceof InitializingBean);
- if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
- ((InitializingBean)
4.销毁阶段
当容器关闭或者 ApplicationContext 被销毁时,容器会调用 Bean 的 destroy() 方法进行清理工作。
在这个阶段,容器会调用实现了 DisposableBean 接口的 destroy() 方法和在 XML 中通过 destroy-method 属性指定的方法来销毁 Bean 对象,释放占用的资源。
以上就是spring中bean的生命周期详解,更多Spring内容请查看:Spring教程(史上最全图文详解)