第七讲-Bean的多种初始化方式和销毁方式

Bean的多种初始化和销毁手段

Spring提供了多种初始化和销毁的手段,下面我们逐渐了解这些初始化和销毁方法,并了解它们的执行顺序。

1. Spring中三种Bean初始化方式流程

我们在Bean1代码中分别写出三种不同的初始化方式:

public class Bean1 implements InitializingBean {

    private static final Logger log = LoggerFactory.getLogger(Bean1.class);

    // 使用@PostConstruct注解完成初始化
    @PostConstruct
    public void init1(){
        log.debug("初始化1");
    }

    // 实现InitializingBean接口来完成初始化
    @Override
    public void afterPropertiesSet() throws Exception {
        log.debug("初始化2");
    }

    // Bean中指定的初始化方法
    public void init3(){
        log.debug("初始化3");
    }
}

然后在主程序中测试:

package com.cherry.chapter1.a07;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class A07Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(A07Application.class);
        context.close();
    }

    @Bean(initMethod = "init3")
    public Bean1 bean1(){
        return new Bean1();
    }

//    @Bean(destroyMethod = "destroy3")
//    public Bean2 bean2(){
//        return new Bean2();
//    }
}
2024-07-24 20:12:26.610 DEBUG 11628 --- [           main] com.cherry.chapter1.a07.Bean1            : 初始化1
2024-07-24 20:12:26.611 DEBUG 11628 --- [           main] com.cherry.chapter1.a07.Bean1            : 初始化2
2024-07-24 20:12:26.613 DEBUG 11628 --- [           main] com.cherry.chapter1.a07.Bean1            : 初始化3

我们发现,Spring中Bean三种初始化顺序如下:

  1. 首先调用@PostConstruct上的方法
  2. 其次调用实现Aware接口的初始化方法
  3. 最后调用@Bean注解上的initMethod上的方法

虽然Spring提供了三种Bean初始化方法,但是我们在实际开发中只需要采用一种初始化方法即可。

2.Spring中Bean三种Bean销毁方式流程

我们在Bean2代码中分别写出三种不同的销毁方式:

package com.cherry.chapter1.a07;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.DisposableBean;

import javax.annotation.PreDestroy;

public class Bean2 implements DisposableBean {

    private static final Logger log = LoggerFactory.getLogger(Bean2.class);

    @PreDestroy
    public void destroy1(){	// 使用@PreDestroy完成Bean的销毁
        log.debug("销毁1");
    }

    @Override
    public void destroy() throws Exception {	// 实现DisposableBean接口中的destroy()方法完成销毁
        log.debug("销毁2");
    }


    public void destroy3(){		// 使用@Bean注解中指定的销毁方法destroyMethod
        log.debug("销毁3");
    }
}

然后在主程序中测试:

package com.cherry.chapter1.a07;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class A07Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(A07Application.class);
        context.close();
    }

    //@Bean(initMethod = "init3")
    //public Bean1 bean1(){
    //    return new Bean1();
    //}

    @Bean(destroyMethod = "destroy3")
    public Bean2 bean2(){
        return new Bean2();
    }
}

2024-07-24 20:20:46.287 DEBUG 12812 --- [           main] com.cherry.chapter1.a07.Bean2            : 销毁1
2024-07-24 20:20:46.287 DEBUG 12812 --- [           main] com.cherry.chapter1.a07.Bean2            : 销毁2
2024-07-24 20:20:46.287 DEBUG 12812 --- [           main] com.cherry.chapter1.a07.Bean2            : 销毁3

同样的,Bean销毁的顺序如下:

  1. 首先调用@PreDestroy上的方法
  2. 其次调用实现DisposableBean接口的销毁方法
  3. 最后调用@Bean注解上的destroyMethod上的方法

同样的,虽然Spring提供了三种Bean销毁方法,但是我们在实际开发中只需要采用一种销毁方法即可。

posted @   LilyFlower  阅读(14)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示