Spring6 探析之 Bean 的创建于销毁

发布时间 2023-07-18 11:06:06作者: acdongla

Spring6 探析之 Bean 的创建于销毁

介绍

控制 bean 的创建与销毁有两类方法

  • 在配置类中使用 @Bean 注解的 initMethod 和 destroyMethod 参数
  • 使用 JSP250 规范中的 @PostConstruct 和 @PreDestroy 注解

我们对这两种方式做一些简单的比较

要使用 JSP250 中的注解,需要配置maven

        <dependency>
            <groupId>jakarta.annotation</groupId>
            <artifactId>jakarta.annotation-api</artifactId>
            <version>2.1.1</version>
        </dependency>

看一下 @PostConstruct 和 @PreDestroy 的源码吧

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface PostConstruct {
}
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface PreDestroy {
}

它们的作用:

  • 被 @PostConstruct 标记的方法会在构造方法之后执行,用于自定义bean的初始化操作
  • 被 @PreDestroy 标记的方法会在bean销毁前执行,用于自定义bean的销毁操作

这两个注解没有参数,并且只能被标记在方法上

实战

创建 PostBean,为了方便演示与比较,这里定义了两组创建和销毁的方法,一个使用JSR250,一个使用 spring中自带的 @Bean 管理

public class PostBean {

    public PostBean() {
        System.out.println("构造方法执行了");
    }

    public void init() {
        System.out.println("自定义方法 init() 执行了");
    }

    public void destroy() {
        System.out.println("自定义销毁方法执行了");
    }

    @PostConstruct
    public void postConstruct() {
        System.out.println("被注解的 postConstruct() 方法执行了");
    }

    @PreDestroy
    public void preDestroy() {
        System.out.println("被注解的 preDestroy() 方法执行了");
    }
}

接着,在配置类中装载这个bean

@Configuration
public class PostBeanConfig {

    @Bean(initMethod = "init", destroyMethod = "destroy")
    public PostBean postBean() {
        return new PostBean();
    }
}

在这里我又使用了 @Bean 的方式管理创建于销毁

写个Main验证下:

public class Main {

    public static void main(String[] args) {
        System.out.println("IOC容器 开始创建");
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(PostBeanConfig.class);
        System.out.println("IOC容器 创建结束");

        context.close();
    }
}

输出结果如下,通过输出结果比较下这两种方法的差别吧

IOC容器 开始创建
构造方法执行了
被注解的 postConstruct() 方法执行了
自定义方法 init() 执行了
IOC容器 创建结束
被注解的 preDestroy() 方法执行了
自定义销毁方法执行了