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

写在前面

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

项目工程源码已经提交到GitHub:https://github.com/sunshinelyz/spring-annotationgit

@PostConstruct注解

@PostConstruct注解好多人觉得是Spring提供的。实际上是Java本身的注解。咱们来看下@PostConstruct注解的源码,以下所示。github

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提供的注解。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被完全卸载以前。执行顺序以下所示。post

调用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()方法。

好了,我们今天就聊到这儿吧!别忘了给个在看和转发,让更多的人看到,一块儿学习一块儿进步!!

项目工程源码已经提交到GitHub:https://github.com/sunshinelyz/spring-annotation

写在最后

若是以为文章对你有点帮助,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习Spring注解驱动开发。公众号回复“spring注解”关键字,领取Spring注解驱动开发核心知识图,让Spring注解驱动开发再也不迷茫。

相关文章
相关标签/搜索