Spring Bean的生命周期

1、对象实例化

2、属性设置

3、初始化

4、使用

5、销毁

示例代码如下:

java 复制代码
import org.springframework.stereotype.Component;

@Component
public class SpringBeanA {
    public SpringBeanA() {
        System.out.println("第一步:实例化(spring对象:SpringBeanA)");
    }
}
java 复制代码
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方法调用");
    }
}
java 复制代码
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

相关推荐
风象南31 分钟前
Spring Boot 实现文件秒传功能
java·spring boot·后端
橘猫云计算机设计31 分钟前
基于django优秀少儿图书推荐网(源码+lw+部署文档+讲解),源码可白嫖!
java·spring boot·后端·python·小程序·django·毕业设计
黑猫Teng35 分钟前
Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实战指南
java·spring boot·后端
星河浪人41 分钟前
Spring Boot启动流程及源码实现深度解析
java·spring boot·后端
佩奇的技术笔记42 分钟前
中级:Maven面试题精讲
java·面试·maven
Lizhihao_1 小时前
JAVA-堆 和 堆排序
java·开发语言
极客先躯1 小时前
高级java每日一道面试题-2025年3月21日-微服务篇[Nacos篇]-什么是Nacos?
java·开发语言·微服务
工业互联网专业1 小时前
基于springboot+vue的动漫交流与推荐平台
java·vue.js·spring boot·毕业设计·源码·课程设计·动漫交流与推荐平台
雷渊1 小时前
深入分析Spring的事务隔离级别及实现原理
java·后端·面试
rebel1 小时前
Java获取excel附件并解析解决方案
java·后端