Spring Bean的生命周期

Spring Bean 的完整生命周期主要包括以下阶段:

  1. 实例化(Instantiation):Spring 容器通过调用 Bean 的构造函数来创建 Bean 的实例。这是 Bean 生命周期的第一步。

  2. 设置属性值(Setting Bean Properties):Spring 容器通过调用 Bean 的 setter 方法来设置 Bean 的属性值,包括依赖注入(Dependency Injection)。

  3. 处理 BeanNameAware 接口(BeanNameAware):如果 Bean 实现了 BeanNameAware 接口,Spring 容器会调用其 setBeanName() 方法,传递 Bean 的名称给它。

  4. 处理 BeanFactoryAware 接口(BeanFactoryAware):如果 Bean 实现了 BeanFactoryAware 接口,Spring 容器会调用其 setBeanFactory() 方法,传递 BeanFactory 给它。

  5. 处理 ApplicationContextAware 接口(ApplicationContextAware):如果 Bean 实现了 ApplicationContextAware 接口,Spring 容器会调用其 setApplicationContext() 方法,传递 ApplicationContext 给它。

  6. BeanPostProcessor 的前置处理(BeanPostProcessor.preProcessBeforeInitialization):如果有注册的 BeanPostProcessor,Spring 容器会在 Bean 的初始化之前调用它们的 postProcessBeforeInitialization() 方法,可以在这一步对 Bean 进行额外的处理。

  7. 初始化(Initialization):Spring 容器会调用 Bean 的初始化方法,可以通过在 Bean 上标注 @PostConstruct 注解或实现 InitializingBean 接口的 afterPropertiesSet() 方法来指定初始化逻辑。

  8. BeanPostProcessor 的后置处理(BeanPostProcessor.postProcessAfterInitialization):如果有注册的 BeanPostProcessor,Spring 容器会在 Bean 的初始化之后调用它们的 postProcessAfterInitialization() 方法,可以在这一步对 Bean 进行额外的处理。

  9. 使用(Bean in Use):Bean 已经完成初始化,可以在应用程序中使用了。

  10. 销毁(Destruction):当应用程序关闭或手动销毁 Bean 时,Spring 容器会调用 Bean 的销毁方法,可以通过在 Bean 上标注 @PreDestroy 注解或实现 DisposableBean 接口的 destroy() 方法来指定销毁逻辑。

简化阶段

 

【其他说明】

BeanNameAware、BeanFactoryAware、ApplicationContextAware类似处理。

在 Spring 中,Bean 实现了 BeanNameAware 接口的方式有两种:

1.实现 BeanNameAware 接口:Bean 可以实现 BeanNameAware 接口,并实现接口中的 setBeanName() 方法,用于接收 Spring 容器传递的 Bean 的名称。例如:

public class MyBean implements BeanNameAware {
    private String beanName;

    @Override
    public void setBeanName(String name) {
        this.beanName = name;
    }

    //...其他属性和方法
}

2.在配置文件中使用 name 属性:在 XML 或者 JavaConfig 配置文件中,可以通过设置 name 属性来显式地为 Bean 指定名称,从而实现 BeanNameAware 接口的效果。例如:

在 XML 配置中:

<bean id="myBean" class="com.example.MyBean" name="customBeanName">
    <!-- 配置其他属性 -->
</bean>

在 JavaConfig 配置(通俗叫代码注解配置)中:

@Configuration
public class MyConfig {
    @Bean(name = "customBeanName")
    public MyBean myBean() {
        // 创建 MyBean 实例并配置其他属性
        return new MyBean();
    }
}

当 Spring 容器创建 MyBean 实例时,会调用 MyBean 实现的 setBeanName() 方法或者使用配置文件中指定的 Bean 名称来传递 Bean 的名称,从而使得 MyBean 实现了 BeanNameAware 接口。在接下来的 Bean 生命周期中,MyBean 可以通过获取 beanName 属性来获取自己在容器中的名称。

ApplicationContextAwareBeanFactoryAware 是 Spring 框架中两个不同的接口,它们都用于在 Spring Bean 中获取容器的引用,但有一些区别:

  1. 功能:ApplicationContextAware 接口用于获取完整的 ApplicationContext 实例,包括其父 ApplicationContext,可以用于进行更加灵活和强大的操作,如获取环境信息、获取配置信息等。而 BeanFactoryAware 接口只能获取当前 Bean 所属的 BeanFactory 实例,相对来说功能较为简单,只能进行基本的 Bean 获取操作。

  2. 引用类型:ApplicationContextAware 接口的引用类型是 ApplicationContext,而 BeanFactoryAware 接口的引用类型是 BeanFactoryApplicationContextBeanFactory 的子接口,它包含了 BeanFactory 的所有功能,并且还提供了更多的功能,如国际化、事件发布、AOP 等。

  3. 使用时机:ApplicationContextAware 接口适用于需要在 Bean 中获取完整的 ApplicationContext 实例的场景,比如需要访问 ApplicationContext 的环境属性、配置信息等高级功能。而 BeanFactoryAware 接口适用于需要在 Bean 中获取当前 Bean 所属的 BeanFactory 实例的场景,比如需要获取其他 Bean 实例的引用等。

  4. 推荐使用:在现代的 Spring 应用中,推荐使用 ApplicationContextAware 接口,因为它提供了更加灵活和强大的功能,包括获取完整的 ApplicationContext 实例和支持更多的高级特性。而 BeanFactoryAware 接口则相对较为简单,适用于一些简单的场景。同时,也可以使用更加细粒度的方式,如使用 @Autowired 注解来注入需要的 Bean 实例,而不是直接使用 ApplicationContextAwareBeanFactoryAware 接口。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿杰技术

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

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

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

打赏作者

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

抵扣说明:

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

余额充值