Spring中InitializingBean源码分析

InitializingBean 是 Spring Framework 提供的一个接口,让开发者在 Bean 初始化时执行一些特定的操作。通过实现 InitializingBean 接口中的 afterPropertiesSet() 方法可以实现这个功能。

下面是 InitializingBean 的源码注释:

public interface InitializingBean {
    /**
     * Invoked by the containing {@code BeanFactory} after it has set all bean properties and satisfied
     * {@link BeanFactoryAware}, {@link ApplicationContextAware} and {@link EnvironmentAware} callbacks.
     * <p>This method allows the bean instance to perform validation of its overall configuration and final initialization
     * when all bean properties have been set.
     * @throws Exception in the event of misconfiguration (such as failure to set an essential property) or if initialization fails for any other reason
     */
    void afterPropertiesSet() throws Exception;
}

从这段注释可以看出,Spring 容器会在对 Bean 进行属性填充、BeanFactoryAware、ApplicationContextAware 和 EnvironmentAware 回调之后调用 afterPropertiesSet() 方法。

下面是一个简单的例子,演示如何在 Spring Boot 中使用 InitializingBean 接口:

@Component
public class MyBean implements InitializingBean {

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("MyBean is initialized.");
    }
}

在这个例子中,我们创建了一个名为 MyBean 的 Spring Bean,并通过实现 InitializingBean 接口来指定在其初始化时执行的操作。当 Spring 容器初始化 MyBean 时,会自动调用 afterPropertiesSet() 方法,并输出一条日志。

需要注意的是,通常情况下,我们应该尽量避免使用 InitializingBean 和 DisposableBean 接口。这两个接口虽然可以帮助我们在 Bean 的生命周期中执行一些初始化和销毁操作,但它们与 Spring 的集成紧密耦合,扩展性不够好。更好的做法是使用 Spring Framework 提供的 @PostConstruct 和 @PreDestroy 注解来完成同样的功能。

在 Spring 容器初始化一个 Bean 的过程中,当 Bean 实例化后,Spring 会执行以下步骤:

  1. 进行依赖注入(Dependency Injection):Spring 会对这个 Bean
    进行属性填充,即自动将配置文件中配置的属性值或者其他 Bean 注入到该 Bean 的相应属性中。
  2. 调用实现了 BeanNameAware 接口的 setBeanName() 方法:如果该 Bean 实现了 BeanNameAware
    接口,则 Spring 将该 Bean 的 ID 传递给 setBeanName() 方法,使得该 Bean 可以获取自己在容器中的
    ID。
  3. 调用实现了 BeanFactoryAware 接口的 setBeanFactory() 方法:如果该 Bean 实现了
    BeanFactoryAware 接口,则 Spring 将该 Bean 的工厂实例传递给 setBeanFactory()
    方法,使得该 Bean 可以获取所在容器的信息。
  4. 调用实现了 ApplicationContextAware 接口的 setApplicationContext() 方法:如果该
    Bean 实现了 ApplicationContextAware 接口,则 Spring 将应用上下文对象传递给
    setApplicationContext() 方法,使得该 Bean 可以获取应用上下文的信息。
  5. 调用实现了 BeanPostProcessor 接口的 postProcessBeforeInitialization()
    方法:如果有任何与该 Bean 相关的 BeanPostProcessor 实现类,Spring 将调用对应的
    postProcessBeforeInitialization() 方法,在该 Bean 初始化之前执行一些操作。
  6. 调用实现了 InitializingBean 接口的 afterPropertiesSet() 方法:如果该 Bean 实现了
    InitializingBean 接口,则 Spring 将调用 afterPropertiesSet() 方法,在该 Bean
    初始化之前执行一些操作。
  7. 调用配置文件中指定的 init-method 方法:如果在 XML 配置文件或者 Java Config 中使用了
    init-method 属性,Spring
    将在这个方法执行之前完成初始化。这个方法可以是任意的方法,只要它不接受任何参数并且没有返回值。
  8. 调用实现了 BeanPostProcessor 接口的 postProcessAfterInitialization()
    方法:如果有任何与该 Bean 相关的 BeanPostProcessor 实现类,Spring 将调用对应的
    postProcessAfterInitialization() 方法,在该 Bean 初始化之后执行一些操作。

需要注意的是,以上步骤中的 5 和 6 步骤是针对实现了 InitializingBean 接口的 Bean 而言的,它们的执行顺序和时机都是在其他步骤之前的,即在依赖注入和属性填充之后。而且,如果同时存在 InitializingBean 接口和配置文件中指定的 init-method 方法,Spring 将先调用 InitializingBean 的 afterPropertiesSet() 方法,再调用指定的 init-method 方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vap8023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值