在以前的文章中,咱们介绍了如何使用@Bean注解指定初始化和销毁的方法,小伙伴们能够参见《【Spring注解驱动开发】如何使用@Bean注解指定初始化和销毁的方法?看这一篇就够了!!》,也介绍了使用InitializingBean和DisposableBean来处理bean的初始化和销毁,小伙伴们能够参见《【Spring注解驱动开发】Spring中的InitializingBean和DisposableBean,你真的了解吗?》。除此以外,在JDK中也提供了两个注解可以在bean加载到Spring容器以后执行和在bean销毁以前执行,今天,咱们就一块儿来看看这两个注解的用法。java
项目工程源码已经提交到GitHub:https://github.com/sunshinelyz/spring-annotationgit
@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注解一样是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注解驱动开发再也不迷茫。