第七讲-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三种初始化顺序如下:
- 首先调用@PostConstruct上的方法
- 其次调用实现Aware接口的初始化方法
- 最后调用@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销毁的顺序如下:
- 首先调用@PreDestroy上的方法
- 其次调用实现DisposableBean接口的销毁方法
- 最后调用@Bean注解上的destroyMethod上的方法
同样的,虽然Spring提供了三种Bean销毁方法,但是我们在实际开发中只需要采用一种销毁方法即可。
分类:
Spring 高级49讲
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .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语句:使用策略模式优化代码结构