在 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教程(史上最全图文详解)
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》