【String注解驱动开发】你真的了解@PostConstruct注解和@PreDestroy注解吗?

简介: 在之前的文章中,我们介绍了如何使用@Bean注解指定初始化和销毁的方法,小伙伴们可以参见《【Spring注解驱动开发】如何使用@Bean注解指定初始化和销毁的方法?看这一篇就够了!!》,也介绍了使用InitializingBean和DisposableBean来处理bean的初始化和销毁,小伙伴们可以参见《【Spring注解驱动开发】Spring中的InitializingBean和DisposableBean,你真的了解吗?》。除此之外,在JDK中也提供了两个注解能够在bean加载到Spring容器之后执行和在bean销毁之前执行,今天,我们就一起来看看这两个注解的用法。

@PostConstruct注解

@PostConstruct注解好多人以为是Spring提供的。其实是Java自己的注解。我们来看下@PostConstruct注解的源码,如下所示。

package javax.annotation;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;
@Documented
@Retention (RUNTIME)
@Target(METHOD)
public @interface PostConstruct {
}

从源码可以看出,@PostConstruct注解是Java中的注解,并不是Spring提供的注解。

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

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

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

@PreDestroy注解

@PreDestroy注解同样是Java提供的,看下源码,如下所示。

package javax.annotation;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;
@Documented
@Retention (RUNTIME)
@Target(METHOD)
public @interface PreDestroy {
}

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

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

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

案例程序

对@PostConstruct注解和@PreDestroy注解有了简单的了解之后,接下来,我们就写一个简单的程序来加深对这两个注解的理解。

我们创建一个Cat类,如下所示。

package io.mykit.spring.plugins.register.bean;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
/**
 * @author binghe
 * @version 1.0.0
 * @description 测试@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()方法...");
    }
}

可以看到,在Cat类中,我们提供了构造方法,init()方法、destroy()方法,使用 @PostConstruct注解标注的postConstruct()方法和只用@PreDestroy注解标注的preDestroy()方法。接下来,我们在AnimalConfig类中使用@Bean注解将Cat类注册到Spring容器中,如下所示。

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

接下来,在BeanLifeCircleTest类中新建testBeanLifeCircle04()方法进行测试,如下所示。

@Test
public void testBeanLifeCircle04(){
    //创建IOC容器
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AnimalConfig.class);
    //关闭IOC容器
    context.close();
}

运行BeanLifeCircleTest类中的testBeanLifeCircle04()方法,输出的结果信息如下所示。

Cat类的构造方法...
Cat的postConstruct()方法...
Cat的init()方法...
Cat的preDestroy()方法...
Cat的destroy()方法...

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

相关文章
|
2月前
4. 解决uni-app开发过程中view、image等标签出现诸如“出现错误:类型“{ class: string; }”的参数不能赋给类型“.......”
4. 解决uni-app开发过程中view、image等标签出现诸如“出现错误:类型“{ class: string; }”的参数不能赋给类型“.......”
163 0
|
4月前
|
Java 索引
Java String应用与开发
Java String应用与开发
55 0
|
4月前
|
SQL JavaScript
js开发:请解释什么是ES6的模板字符串(template string),并给出一个示例。
ES6的模板字符串以反引号包围,支持变量和表达式插入以及多行书写。例如,插入变量值`Hello, ${name}!`,计算表达式`${num1 + num2}`,以及创建多行字符串。模板字符串保留原始空格和缩进,简化了字符串拼接,提高了代码可读性。
42 6
|
安全 Java 编译器
Java中的String实例化、Annotation注解类、继承的多态和Object类(附带相关面试题)
1.java中String两种实例化对象2.Annotation注解类 3.继承的多态 4.Object类
106 0
Java中的String实例化、Annotation注解类、继承的多态和Object类(附带相关面试题)
10 个 Python String 字符串的常用技巧,大大地提升我们的开发效率,终于有时间陪女朋友了
10 个 Python String 字符串的常用技巧,大大地提升我们的开发效率,终于有时间陪女朋友了
|
缓存 NoSQL Java
【Java原理探索】带你攻克String类创建的难点分析 | Java开发实战
【Java原理探索】带你攻克String类创建的难点分析 | Java开发实战
121 0
【Java原理探索】带你攻克String类创建的难点分析 | Java开发实战
|
存储 缓存 安全
【Java原理探索】带你探究String类不可变的特性 | Java开发实战
【Java原理探索】带你探究String类不可变的特性 | Java开发实战
185 1
【Java原理探索】带你探究String类不可变的特性 | Java开发实战
|
存储 安全 Java
Java开发——16.常用类(Scanner、Object、String、StringBuffer、StringBuilder)
Scanner:一个简单的文本扫描器,可以使用正则表达式解析原始类型和字符串。
Java开发——16.常用类(Scanner、Object、String、StringBuffer、StringBuilder)
|
存储 算法 安全
【Java原理探索】带你实战使用String的功能特性 | Java开发实战
【Java原理探索】带你实战使用String的功能特性 | Java开发实战
125 0
【Java原理探索】带你实战使用String的功能特性 | Java开发实战
|
缓存 Java Android开发
【Android 应用开发】Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片
【Android 应用开发】Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片
283 0
【Android 应用开发】Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片