@PostConstruct与@PreDestroy使用

前言

源码

@Documented
@Retention (RUNTIME)
@Target(METHOD)
public @interface PostConstruct {
}

@Documented
@Retention (RUNTIME)
@Target(METHOD)
public @interface PreDestroy {
}

@PostConstruct

@PostConstruct注解好多人以为是Spring提供的。其实是Java自己的注解。从源码可以看出,@PostConstruct注解是Java中的注解,并不是Spring提供的注解。

@PostConstruct注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。

通常我们会是在Spring框架中使用到@PostConstruct注解,该注解的方法在整个Bean初始化中的执行顺序:

Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)。

@PreDestroy注解

被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。执行顺序如下所示。

调用destroy()方法->@PreDestroy->destroy()方法->bean销毁。

总结:@PostConstruct,@PreDestroy是Java规范JSR-250引入的注解,定义了对象的创建和销毁工作,同一期规范中还有注解@Resource,Spring也支持了这些注解。

测试案例

package com.lyj.demo.pojo;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * @author 凌兮
 * @date 2021/4/14 9:34
 * @PostConstruct 和 @PreDestroy 注释使用测试
 */
public class Cat {

    public Cat() {
        System.out.println("cat 构造器执行");
    }

    public void init() {
        System.out.println("cat init 方法执行");
    }

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

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

    public void destroy() {
        System.out.println("cat destroy 方法执行");
    }
}

package com.lyj.demo.pojo;

import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

/**
 * @author 凌兮
 * @date 2021/4/14 9:46
 */
@Component
public class AnimalConfig {

    /**
     * 将Cat注入到Spring Bean里,
     * @return
     */
    @Bean(initMethod = "init", destroyMethod = "destroy")
    public Cat cat() {
        return new Cat();
    }
}
  /**
     * @PostConstruct 和 @PreDestroy 注释使用测试
     */
    @Test
    public void postConstruct() {
        // 创建IOC容器
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AnimalConfig.class);
        // 关闭IOC容器
        context.close();
    }

结果

在这里插入图片描述

总结

从输出的结果信息中,可以看出执行的顺序是: 构造方法 -> @PostConstruct -> init()方法 -> @PreDestroy -> destroy()方法。

@PostConstruct注解和@PreDestroy注解是Java EE规范中定义的两个注解。@PostConstruct注解用于标注一个方法,该方法会在依赖注入完成后被自动调用,通常用于在初始化阶段执行一些操作。而@PreDestroy注解用于标注一个方法,该方法会在对象销毁之前被自动调用,通常用于在销毁前执行一些清理操作。 在引用中提到,我们可以在Dog类中使用@PostConstruct注解和@PreDestroy注解来分别标注init()方法和destroy()方法。@PostConstruct注解修饰的方法会在依赖注入完成后被调用,类似于初始化方法。而@PreDestroy注解修饰的方法会在对象销毁之前被调用,类似于销毁方法。 在引用中提到,被@PreDestroy注解修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次。它会在destroy()方法之后执行,而destroy()方法是Servlet生命周期中的一个方法,用于在Servlet被彻底卸载之前执行一些清理操作。 综上所述,@PostConstruct注解和@PreDestroy注解是用于在依赖注入完成后执行初始化操作和在对象销毁前执行清理操作的注解。它们在Java EE开发中常用于管理对象的生命周期。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Spring注解驱动之@PostConstruct和PreDestroy注解](https://blog.csdn.net/tianzhonghaoqing/article/details/126689583)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌兮~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值