Spring Ben的生命周期95%的人都不知道这几个点

文摘   2025-01-23 08:03   新疆  

Spring Boot 3实战案例合集》现已囊括超过80篇精选实战文章,并且此合集承诺将永久持续更新,为您带来最前沿的技术资讯与实践经验。欢迎积极订阅,享受不断升级的知识盛宴!订阅用户将特别获赠合集内所有文章的最终版MD文档(详尽学习笔记),以及完整的项目源码,助您在学习道路上畅通无阻。

【重磅发布】《Spring Boot 3实战案例锦集》PDF电子书现已出炉!

🎉🎉我们精心打造的《Spring Boot 3实战案例锦集》PDF电子书现已正式完成,目前已经有80个案例,后续还将继续更新。文末有电子书目录。

💪💪永久更新承诺

我们郑重承诺,所有订阅合集的粉丝都将享受永久免费的后续更新服务。这意味着,随着技术的不断发展和Spring Boot 3的深入应用,我们的电子书也将持续更新,确保您始终掌握最前沿、最实用的技术知识。

💌💌如何获取
请立即订阅我们的合集点我订阅,并通过私信联系我们,我们将第一时间将电子书发送给您。

现在就订阅合集


环境:SpringBoot3.2.5



1. 简介

Spring管理Bean的声明周期可以实现 InitializingBeanDisposableBean 接口。容器会调用前者的 afterPropertiesSet() 和后者的 destroy() 来让 Bean 在初始化和销毁 Bean 时执行某些操作。本篇文章将只介绍Bean的销毁

回顾Bean销毁

实现接口DisposableBean

@Componentpublic class BeanLifecycle03 implements DisposableBean {
public void destroy() throws Exception { System.out.println("DisposableBean destroy...") ; }}

当容器销毁时会调用上面的destroy方法。

通过注解@PreDestroy

@PreDestroypublic void destroyProcess() {  System.out.println("des...") ;}

注:这里的方法名可以随意,同时修饰符也可以是private

同时应用上面2种方式:@PreDestroy优先于Disposablebean执行。

通过注解@Bean配置

// 定义beanpublic class BeanLifecycle04 {    public void customDestroy() {    System.out.println("BeanLifecycle04 customDestroy...") ;  }}@Bean(destroyMethod = "customDestroy")BeanLifecycle04 beanLifecycle04() {  return new BeanLifecycle04() ;}

通过destroyMethod属性指定销毁的回调方法。

接下来将介绍销毁回调的其它应用方式。

2. 高级技能

2.1 @Bean自动应用销毁回调

在通过@Bean定义对象时,该注解有个destroyMethod属性默认值是: (inferred)

如果你不去修改该属性,那么你可以在你定义的bean对象中定义如下2个名称的方法

  • close

  • shutdown

      

如果你的方法中有上面2个方法任意一个,那么容器在关闭时也是会调用对应的回调方法的,close优先于shutdown方法。如下示例:

public class CommonService {  public void close() {    System.out.println("CommonService close...") ;  }  public void shutdown() {    System.out.println("CommonService shutdown...") ;  }}@Beanpublic CommonService commonService() {  return new CommonService() ;}

如上定义后,容器销毁时自动调用上面的close方法,如果没有close方法则查找shutdown方法。这是Spring的自动推断机制

2.2 实现AutoCloseable接口

除了上面的方式外,我们还可以让对象实现AutoCloseable接口来执行销毁回调。

public class BeanLifecycle04 implements AutoCloseable {  @Override  public void close() throws Exception {    System.out.println("BeanLifecycle04 AutoCloseable close...") ;  }}@Beanpublic BeanLifecycle04 beanLifecycle04() {  return new BeanLifecycle04() ;}

这种方式也是会自动执行close回调方法。

这种方式还有一个好处是,我们可以直接在类上添加@Component注解,这种方式也可以自动调用close方法。

2.3 方法参数

在特殊的情况(通过配置销毁方法)销毁方法都能接收一个参数,而且参数类型必须是Boolean类型,如下示例:

public class CommonService {  public void close(boolean flag) {    System.out.printf("CommonService close...flag: %s%n", flag) ;  }}@Bean(destroyMethod = "close")public CommonService commonService() {  return new CommonService() ;}

通过上面的方式你可以接受一个boolean类型的参数,必须是boolean,如果是其它参数将会报异常。注:自动推断机制不支持,反而有了参数后将不会执行

2.4 统一添加推断机制

如果你想对所有的bean或者是某些bean统一配置可进行自动推断机制那么你可以通过如下的方式进行处理

public class ProcessInferredBeanFactoryPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { String[] names = registry.getBeanDefinitionNames() ; for (String name : names) { BeanDefinition beanDefinition = registry.getBeanDefinition(name) ; String className = beanDefinition.getBeanClassName() ; if (Objects.nonNull(className) && className.startsWith("com.pack")) {        // 名称必须是它 beanDefinition.setDestroyMethodName("(inferred)") ; } } }}

如上这样配置后,只要你的bean对象中存在上面说的方法名,那么容器在关闭时就会调用对应的销毁回调方法。

以上是本篇文章的全部内容,如对你有帮助帮忙点赞+转发+收藏

推荐文章

优雅重构Spring Boot代码,我用这6种策略消灭if else

优雅!SpringBoot统一返回结果就该这样处理

总结了8个SpringBoot开发技巧,你都知道吗?

造轮子能力!基于SpringBoot实现高性能缓存组件

强大!SpringBoot通过这3个注解监测Controller接口

SpringBoot自带Controller接口监控,赶紧用起来

强大!基于SpringBoot实现AOP的动态热插拔功能

强大!基于SpringBoot实现AOP的动态热插拔功能

SpringBoot3第三方接口调用10种方式,最后一种你肯定没用过

提升系统吞吐量,详解JDK21虚拟线程,炸裂

基于SpringBoot通过3种方式轻松搞定敏感字段加密处理

两种方式实现SpringBoot外部配置实时刷新最佳实践

是否还记得SpringMVC中的@MatrixVariable注解?

Spring全家桶实战案例源码
spring, springboot, springcloud 案例开发详解
 最新文章