当前位置: 首页 > news >正文

Spring Bean的生命周期

1、对象实例化

2、属性设置

3、初始化

4、使用

5、销毁

示例代码如下:

import org.springframework.stereotype.Component;

@Component
public class SpringBeanA {
    public SpringBeanA() {
        System.out.println("第一步:实例化(spring对象:SpringBeanA)");
    }
}
import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class SpringBeanLifeCycle implements InitializingBean, BeanNameAware, BeanFactoryAware, DisposableBean {

    private SpringBeanA springBeanA;

    @Autowired
    public void setControllerTest(SpringBeanA springBeanA) {
        System.out.println("第二步:属性设置(spring对象注入,@Autowired、@Resource、@Value)");
        this.springBeanA = springBeanA;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("第三步:属性设置后,调用InitializingBean接口的方法");
    }

    @PostConstruct
    public void postConstructMethod() {
        System.out.println("(init方法调用前)@PostConstruct方法调用");
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("(init方法调用前)SetBeanFactory回调接口");
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("(init方法调用前)setBeanName回调接口, name=" + name);
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("第四步:DisposableBean-->destroy方法调用");
    }

    @PreDestroy
    public void testDestroy() {
        System.out.println("第四步(另一种方式):@PreDestroy方法调用");
    }
}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ConfigurationBeanTest {

    @Bean(initMethod = "initMethodTest",destroyMethod = "destroyTest")
    public SpringBean getBean() {
        return new SpringBean();
    }

    public static class SpringBean {
        public void initMethodTest() {
            System.out.println("第三步(另一种方式):@Bean(initMethod属性标识的方法)");
        }
        public void destroyTest() {
            System.out.println("第四步(另一种方式):@Bean(destroyMethod属性标识的方法)");
        }
    }
}

打印如下:

第一步:实例化(spring对象:SpringBeanA)
第二步:属性设置(spring对象注入,@Autowired、@Resource、@Value)
(init方法调用前)setBeanName回调接口, name=springBeanLifeCycle
(init方法调用前)SetBeanFactory回调接口
(init方法调用前)@PostConstruct方法调用
第三步:属性设置后,调用InitializingBean接口的方法
第三步(另一种方式):@Bean(initMethod属性标识的方法)
(Tomcat started)
第四步(另一种方式):@Bean(destroyMethod属性标识的方法)
第四步(另一种方式):@PreDestroy方法调用
第四步:DisposableBean-->destroy方法调用

说明:

实现接口BeanNameAware,可以让SpringBean知道自己的名字,做一些日志记录等操作;实现BeanFactoryAware是为了让SpringBean拥有访问BeanFactory的能力,从而可以根据需要使用beanFactory.getBean()获取别的SpringBean,但是要谨慎使用,因为这个可能会破坏Ioc的原则,尽可能使用@Autowired或者@Value注解使用别的SpringBean

http://www.dtcms.com/a/20010.html

相关文章:

  • wordpress主题插件开发中高频使用的38个函数
  • 了解rtc_time64_to_tm()和rtc_tm_to_time64()
  • WEB安全--SQL注入--二次注入
  • TCP/UDP 简介,三次握手与四次挥手
  • 使用瑞芯微RK3588的NPU进行模型转换和推理
  • Python使用OpenCV图片去水印多种方案实现
  • Redis问题排查常用命令
  • C#多线程异步连接MySQL与SQLserver数据库
  • E卷-MELON的难题-(200分)
  • 功能说明并准备静态结构
  • 硕成C语言22【一些算法和数组的概念】
  • 【C++】哈希、unordered_map与unordered_set的模拟实现
  • AcWing——3624. 三值字符串
  • windows配置永久路由
  • VMware vSphere数据中心虚拟化——vCenter Server7.0安装部署
  • 【ARM】解决ArmDS Fast Models 中部分内核无法上电的问题
  • 深入理解 Qt 信号与槽机制:原理、用法与优势
  • Spring Boot 携手 DeepSeek:开启智能交互新时代
  • C语言进阶习题【3】(5 枚举)——找单身狗2
  • 3DsMax快捷键
  • 【kafka系列】Kafka事务的实现原理
  • VSCode C/C++ 开发环境完整配置及常见问题(自用)
  • java枚举类型的查找
  • USC 安防平台之移动侦测
  • github上文件过大无法推送问题
  • 智能编程助手功能革新与价值重塑之:GitHub Copilot
  • 今日写题work05
  • Autojs: 使用 SQLite
  • Word中打开开发工具【修改日期控件显示格式】
  • C#学习之S参数读取(s2p文件)