Spring 容器中的 Bean 是有生命周期的,Spring 允许在 Bean 在初始化完成后以及 Bean 销毁前执行特定的操作,我们既可以通过实现
InitializingBean/DisposableBean 接口来定制初始化之后 / 销毁之前的操作方法,也可以通过 <bean> 元素的
init-method/destroy-method 属性指定初始化之后 / 销毁之前调用的操作方法。
JSR-250 为初始化之后/销毁之前方法的指定定义了两个注释类,分别是 @PostConstruct 和 @PreDestroy,这两个注释只能应用于方法上。标注了 @PostConstruct 注释的方法将在类实例化后调用,而标注了 @PreDestroy 的方法将在类销毁之前调用。
只需要在方法前标注 @PostConstruct 或 @PreDestroy ,这些方法就会在 Bean 初始化后或销毁之前被 Spring 容器执行了。
我们知道,不管是通过实现 InitializingBean /DisposableBean 接口,还是通过 <bean> 元素的
init-method/destroy-method 属性进行配置,都只能为 Bean 指定一个初始化 / 销毁的方法。但是使用@PostConstruct 和 @PreDestroy 注释却可以指定多个初始化 / 销毁方法,那些被标注 @PostConstruct 或 @PreDestroy 注释的方法都会在初始化 / 销毁时被执行。
通过以下的测试代码,您将可以看到 Bean 的初始化 / 销毁方法是如何被执行的。
一、Spring @PostConstruct and @PreDestroy
下面是一个简单的Spring bean-MyBean,应用了@PostConstruct和@PreDestroy注解。
package com.rickie.beanlifecycle;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class MyBean {
public MyBean() {
System.out.println(“MyBean instance created”);
}
@PostConstruct
private void init() {
System.out.println(“Verifying Resources”);
}
@PreDestroy
private void shutdown() {
System.out.println(“Shutdown All Resources”);
}
public void close() {
System.out.println(“Closing All Resources”);
}
}
注意:上面也定义了一个close() 方法,用来检查当bean销毁的时候是否会被调用。
二、MyConfiguration配置类
下面是一个简单的Spring 配置类,MyConfiguration类的代码如下:
package com.rickie.beanlifecycle;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfiguration {
@Bean
public MyBean myBean() {
return new MyBean();
}
}
三、main类
下面是main类,其中创建spring上下文并获得很少的MyBean实例。
package com.rickie.beanlifecycle;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class MyBean {
public MyBean() {
System.out.println(“MyBean instance created”);
}
@PostConstruct
private void init() {
System.out.println(“Verifying Resources”);
}
@PreDestroy
private void shutdown() {
System.out.println(“Shutdown All Resources”);
}
public void close() {
System.out.println(“Closing All Resources”);
}
}
运行上述代码,查看输出结果:
MyBean instance created
Verifying Resources
myBean1.hashCode()=1572098393
myBean2.hashCode()=1572098393
Shutdown All Resources
Closing All Resources
四、小结
@PostConstruct:在bean创建完成并且属性赋值完成;来执行初始化方法。
@PreDestroy:在容器销毁bean之前,通知我们进行清理工作。
构建顺序如下:
构造器–>自动注入–>@PostConstrut 方法 –>InitializingBean–>xml中配置init方法
销毁顺序如下:
@PreDestroy 方法 –DisposableBean–>xml中destroy-method方法
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!