自定义Bean的初始化和销毁
Bean的生命周期包含创建、初始化和销毁等。Spring管理Bean的生命周期,当到达初始化和销毁阶段的时候,调用我们自己定义的初始化和销毁方法。
public class Student {
public Student() {
System.out.println("Student 构造器");
}
public void init() {
System.out.println("Student 初始化");
}
public void destroy() {
System.out.println("Student 销毁");
}
}
@Configuration
public class BeanMainConfig {
@Bean
public Student student() {
return new Student();
}
}
测试
@Test
public void testLifeCycle() {
AnnotationConfigApplicationContext applicationContext =
new AnnotationConfigApplicationContext(BeanMainConfig.class);
System.out.println("容器创建完成");
}
Student 构造器
容器创建完成
默认是单实例的Bean,在容器启动的时候,就会调用构造器方法创建对象。
在Student中,创建了init和destroy方法,如何将其添加到Spring管理Bean的生命周期中执行呢?其实和以前用xml配置的方式差不多,只要在@Bean中添加指定初始化和销毁的方法即可。
@Bean(initMethod = "init", destroyMethod = "destroy")
测试
Student 构造器
Student 初始化
容器创建完成
容器在启动的时候,先会去调用构造器方法创建对象,然后初始化该对象,放入到容器中,此时容器创建完成。但是并没有调用销毁方法,那是因为容器没有关闭,Bean也会存在。
@Test
public void testLifeCycle() {
AnnotationConfigApplicationContext applicationContext =
new AnnotationConfigApplicationContext(BeanMainConfig.class);
System.out.println("容器创建完成");
//关闭容器
applicationContext.close();
}
Student 构造器
Student 初始化
容器创建完成
Student 销毁
在容器关闭的时候,调用销毁方法。这样,在整个Spring管理Bean的生命周期的过程中,就可以自定义初始化和销毁方法。
上面这种是针对于单实例的Bean而言,如果是多实例的Bean,那会是如何呢?
@Configuration
public class BeanMainConfig {
@Scope("prototype")
@Bean(initMethod = "init", destroyMethod = "destroy")
public Student student() {
return new Student();
}
}
@Test
public void testLifeCycle() {
AnnotationConfigApplicationContext applicationContext =
new AnnotationConfigApplicationContext(BeanMainConfig.class);
System.out.println("容器创建完成");
Object student = applicationContext.getBean("student");
Object student2 = applicationContext.getBean("student");
//关闭容器
applicationContext.close();
}
测试
容器创建完成
Student 构造器
Student 初始化
Student 构造器
Student 初始化
总结:
- 构造器(创建对象)
单实例:在容器启动的时候创建对象
多实例:在每次获取的时候创建对象 - 初始化
对象创建完成,并赋值完成,调用初始化方法 - 销毁
单实例:在容器关闭的时候,调用销毁方法
多实例:容器不会管理这个Bean的销毁,不会调用销毁方法