首页 > 其他分享 >Bean的生命周期

Bean的生命周期

时间:2024-09-10 10:56:00浏览次数:3  
标签:生命周期 接口 Bean 执行 方法 public

1、什么是Bean的生命周期

我们知道Sprintg IOC容器管理的Bean都是单例模式,即每个Bean只有一个实例化的Bean对象存在于Spring IOC容器中,因次Spring IOC容器需要负责管理Bean的创建、使用和销毁的整个过程,也就是Bean的生命周期。

2、生命周期演示

下面先以Bean自身方法和Bean生命周期接口方法为例,演示其各个生命周期的执行时序。

  • init-method:指定某个方法在Bean实例化完成,依赖关系设置结束后执行。
  • destroy-method:指定某个方法在Bean销毁之前被执行。
  • InitializingBean接口:指定在Bean实例化完成,依赖关系设置结束后执行(在init-method之前执行)。
  • DisposableBean接口:指定某个方法在Bean销毁之前被执行(在destory-method之前执行)。
  • ApplicationContextAware接口:在实例化Bean时,为Bean注入ApplicationContext。
  • BeanNameAware接口:在实例化Bean时,为Bean注入beanName。

以下代码BeanLifecycle将实现上述4个接口InitializingBean、DisposableBean、ApplicationContextAware和BeanNameAware,并在XML文件中配置该Bean的init-method和destroy-method。

package cn.exercise.bean;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class Student implements InitializingBean, BeanNameAware, BeanFactoryAware, ApplicationContextAware, DisposableBean {
    public Student() {
        System.out.println("1.【Bean级别】创建了Student对象");
    }
    /**
     * BeanNameAware接口的方法
     * @param name
     */
    @Override
    public void setBeanName(String name) {
        System.out.println("2.【Bean级别】执行了接口BeanNameAware的setBeanName()方法,beanName="+name);
    }

    /**
     * BeanFactoryAware
     * @param beanFactory
     * @throws BeansException
     */
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("3.【Bean级别】执行了接口BeanFactoryAware的setBeanFactory()方法");
    }

    /**
     * ApplicationContextAware
     * @param applicationContext
     * @throws BeansException
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("4.【Bean级别】执行了接口ApplicationContextAware的setApplicationContext()方法");
    }
    /**
     * InitializingBean 接口方法
     * @throws Exception
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("5.【Bean级别】执行了接口InitializingBean的afterPropertiesSet()方法 ");
    }

    /**
     * DisposableBean
     * @throws Exception
     */
    @Override
    public void destroy() throws Exception {
        System.out.println("8.【Bean级别】调用DisposableBean接口的destroy()方法");
    }
    
    public void lifecycleInit(){
        System.out.println("6.【Bean级别】调用了init方法");
    }
    public void lifecycleInitDestroy(){
        System.out.println("9.【Bean级别】容器销毁前调用了destroy方法");
    }

    public void sayHello(){
        System.out.println("7.【Bean级别】调用Bean自身的业务方法");
    }
}

如上述代码中的注释所示,BeanLifecycle这个Bean的生命周期将按照序号1~8顺序执行。
在配置文件中进行如下配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<bean class="cn.exercise.bean.BeanLifecycle" id="beanLifecycle" init-method="lifecycleInit"
          destroy-method="lifecycleInitDestroy"></bean>
</beans>

下面是对BeanLifecycle准备的测试代码:

package cn.exercise.test;
import cn.exercise.bean.BeanLifecycle;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        BeanLifecycle beanLifecycle = (BeanLifecycle) context.getBean("beanLifecycle");
        beanLifecycle.sayHello();
        context.close();
    }
}

上述测试代码很简单,就是通过从Spring IoC容器中注入的BeanLifecycle对象,调用其sayHello()方法。测试代码运行后的结果如图所示:

在这里插入图片描述

通过执行结果可以得到Bean自身方法和Bean生命周期接口方法的执行时序:

  1. 执行构造器。
  2. 为对象中的属性注入值
  3. 执行BeanNameAware接口的setBeanName(String name)方法。
  4. 执行BeanFactoryAware接口的setBeanFactory()方法
  5. 执行ApplicationContextAware接口的setApplicationContext(ApplicationContextapplication Context)方法。
  6. 执行InitializingBean接口的afterPropertiesSet()方法。
  7. 执行init-method指定的方法。
  8. 执行运行时Bean中的业务方法。
  9. 执行DisposableBean接口的destroy()方法。
  10. 执行destroy-method指定的方法。

Bean自身方法和Bean生命周期接口方法执行的生命周期如图所示:
在这里插入图片描述
通过BeanLifecycle例子将可以更加清晰的了解到Bean自身方法和Bean生命周期接口方法的生命周期。

标签:生命周期,接口,Bean,执行,方法,public
From: https://blog.csdn.net/weixin_45189070/article/details/142089936

相关文章

  • 在执行django定时任务中,遇到的celery woker生命周期问题
    在执行django定时任务中,遇到的celerywoker生命周期问题问题描述:当我celeryworker正常启动时,我的定时任务在admin也正常跑,可总是跑完之后和预期结果对不上,结果我发现了个问题,只能在生产环境测的出来,本地一点问题也没有,先看代码。我的定时任务task.py部分代码如下:frompo......
  • vue3生命周期(钩子函数)
    在Vue3中,生命周期钩子被重命名并分为了不同的阶段,以更好地描述它们的用途。这些新的生命周期钩子包括:setup():这是一个新的入口点,在beforeCreate和created之前调用。onBeforeMount/onMounted:组件挂载前/后的生命周期钩子。onBeforeUpdate/onUpdated:组件更新前/后的生命......
  • 【C++基础概念理解——std::unique_ptr如何管理动态分配的对象的生命周期?】
    文章目录问题解释问题std::unique_ptr用于管理动态分配的对象的生命周期,那么这种智能指针怎么实现管理生命周期的呢?解释用于确保对象不再使用时自动释放,从而避免内存泄漏。std::unique_ptr独占管理对象的所有权,同一时间只能有一个std::unique_ptr指向该对象。确保......
  • BeanShell预处理器获取jmeter请求后变量无法替换
    背景jmeter接口验签逻辑是从请求参数中获取值处理加密验签后,讲请求参数中的sign值替换如果处理后直接讲sign生成Jmeter变量,在当前请求是无法替换的,因为jmeter请求的URL和body已经运行,不会再重新运行替换解决方法在当前预处理程序中再写处理当前请求的逻辑//替换URL中的sig......
  • Pod 生命周期的钩子函数
    在Kubernetes中,Pod的生命周期管理可以通过钩子函数(LifecycleHooks)来增强。这些钩子允许开发者在Pod的特定生命周期阶段执行自定义操作。以下是两种主要的钩子函数:1.PreStopHook描述:在容器被终止之前执行的钩子。这个钩子通常用于在容器停止前执行一些清理操作,比如关闭连接......
  • Android中Fragment的生命周期
    文章目录Android中Fragment的生命周期碎片的状态和回调碎片完整的生命周期Android中Fragment的生命周期和活动一样,碎片也有自己的生命周期,并且它和活动的生命周期实在是太像了,我相信你很快就能学会,下面我们马上就来看一下。碎片的状态和回调还记得每个活动在其生......
  • 谈谈Spring中的BeanPostProcessor接口(转)
    原文:谈谈Spring中的BeanPostProcessor接口作者:特务依昂 一.前言  这几天正在复习Spring的相关内容,在了解bean的生命周期的时候,发现其中涉及到一个特殊的接口——BeanPostProcessor接口。由于网上没有找到比较好的博客,所有最后花了好几个小时,通过Spring的官方文档对它做了......
  • SpringBoot学习(8)(Bean注册条件)(@Conditional的衍生注解)
    目录一、引言二、案例引用(接着上篇博客)三、注册条件(1)@ConditionalOnProperty(2)Conditional0nMissingBean(3)@ConditionalOnclass四、总结一、引言之前学习和了解了Bean对象的注册。其中涉及注解有@Bean与@Import。Bean管理的第三个部分——>注册条件二、案例引用(接......
  • 深入探讨Spring中Bean的初始化方式
    一、Spring中的Bean定义与生命周期在探讨具体的初始化方式之前,有必要对Spring中的Bean定义与生命周期进行简单回顾。1.1Bean的定义在Spring中,Bean指的是由Spring容器管理的对象。Bean的定义可以通过以下几种方式:XML配置:通过<bean>标签定义Bean。Java配置:通过@Configura......
  • 【学亮IT手记】Servlet的生命周期
    1.1 Servlet的生命周期1.1.1 Servlet的生命周期概述1.1.1.1 什么是生命周期生命周期:一个对象从创建到销毁过程。1.1.1.2 Servlet的生命周期(*****)Servlet生命周期:Servlet对象从创建到销毁的过程。l Servlet何时被创建又是何时被销毁的?Servlet中有init,service,destroy方法,这几......