问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Spring中@PostConstruct和@PreDestroy注解详解与实战

创作时间:
作者:
@小白创作中心

Spring中@PostConstruct和@PreDestroy注解详解与实战

引用
CSDN
1.
https://blog.csdn.net/wochunyang/article/details/137560813

@PostConstruct和@PreDestroy介绍

@PostConstruct和@PreDestroy是Java EE(Enterprise Edition)和Java SE(Standard Edition)中的注解,它们用于指定一个bean在其生命周期的特定点应该执行的方法。这两个注解是JSR250规范中提供的注解。

  1. @PostConstruct:
  • 这个注解用于标记一个方法,该方法将在依赖注入完成后立即执行。
  • 它通常用于执行对象的初始化操作,比如设置默认值、连接数据库、打开文件等。
  • 这个注解可以应用于任何方法,但通常建议只应用于无参数的方法。
  • 当一个类被实例化并注入依赖后,容器会自动调用标记有@PostConstruct的方法。
  1. @PreDestroy:
  • 这个注解用于标记一个方法,该方法将在对象被销毁之前执行。
  • 它通常用于执行清理操作,比如关闭数据库连接、释放资源等。
  • 与@PostConstruct类似,@PreDestroy也可以应用于任何方法,但通常建议只应用于无参数的方法。
  • 当容器决定销毁一个对象时,它会自动调用标记有@PreDestroy的方法。

@PostConstruct和@PreDestroy源码

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

@PostConstruct和@PreDestroy属性介绍

无属性。

@PostConstruct和@PreDestroy注解使用场景

  1. 资源初始化和配置:
  • 在对象创建后,可能需要初始化一些资源,如数据库连接、网络连接、文件句柄等。@PostConstruct注解可以用来确保这些资源在对象准备好使用之前被正确地初始化。
  1. 依赖注入后的设置:
  • 在依赖注入完成后,可能需要对注入的依赖进行一些额外的设置或验证。@PostConstruct注解可以用来执行这些操作。
  1. 对象销毁前的清理:
  • 当对象不再需要时,可能需要执行一些清理操作,如关闭数据库连接、释放内存、清理临时文件等。@PreDestroy注解可以用来确保这些清理操作在对象被销毁之前执行。
  1. 状态保存:
  • 在对象销毁之前,可能需要保存对象的状态,以便在下次启动时恢复。@PreDestroy注解可以用来执行这些保存操作。
  1. 日志记录:
  • 在对象创建和销毁时,可能需要记录日志,以便跟踪对象的生命周期。@PostConstruct和@PreDestroy注解可以用来记录这些事件。
  1. 事务管理:
  • 在某些情况下,可能需要在对象创建后立即开始一个事务,或者在对象销毁前提交或回滚事务。@PostConstruct和@PreDestroy注解可以用来管理这些事务。
  1. 安全性和权限检查:
  • 在对象创建后,可能需要执行安全性和权限检查,以确保对象只能被授权的用户访问。@PostConstruct注解可以用来执行这些检查。
  1. 依赖检查:
  • 在对象创建后,可能需要检查依赖是否存在或是否满足特定的条件。@PostConstruct注解可以用来执行这些检查。
  1. 性能优化:
  • 在对象创建后,可能需要进行一些性能优化,如缓存配置、调整线程池大小等。@PostConstruct注解可以用来执行这些优化。
  1. 测试和验证:
  • 在对象创建后,可能需要进行一些测试和验证,以确保对象的正确性。@PostConstruct注解可以用来执行这些测试。

@PostConstruct和@PreDestroy测试示例代码

Maven依赖

在pom.xml中添加以下依赖:

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

PrePostDemo类

package com.yang.SpringTest.annotation.preposLearn;

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

public class PrePostDemo {
    public PrePostDemo() {
        System.out.println("****** PrePostDemo constructor ...");
    }

    public void initMethod() {
        System.out.println("****** PrePostDemo init ...");
    }

    public void destroyMethod() {
        System.out.println("****** PrePostDemo destroy ...");
    }

    @PostConstruct
    public void postConstruct(){
        System.out.println("****** PrePostDemo postConstruct ...");
    }

    @PreDestroy
    public void preDestroy(){
        System.out.println("****** PrePostDemo preDestroy ...");
    }
}

PrePostDemoConfig配置类

package com.yang.SpringTest.annotation.preposLearn;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class PrePostDemoConfig {
    @Bean(initMethod = "initMethod", destroyMethod = "destroyMethod")
    public PrePostDemo prePostDemo(){
        return new PrePostDemo();
    }
}

PrePostDemoTest测试类

package com.yang.SpringTest.annotation.preposLearn;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class PrePostDemoTest {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(PrePostDemoConfig.class);
        context.close();
    }
}

运行结果

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号