12、生命周期-@Bean指定初始化和销毁方法
- Bean的生命周期:创建-》初始化-》销毁
- 容器管理bean的生命周期
- 我们可以自定义初始方法和销毁方法,容器在bean进行到当期那生命周期的时候调用我们自定的方法
- 构造(对象创建):
- 单实例:在容器启动的时候创建
- 多实例:在实例被每次调用的时候创建对象
- 初始化:对象创建完成并赋值好,调用初始化方法
- 销毁:
- 单实例:在容器关闭的时候进行销毁
- 多实例:容器不会管理这个bean,不会销毁(可以手动调用)
- 指定初始化和销毁方法:
- 【xml】 指定 init-method="" destroy-method=""
- 【注解】 @Bean(initMethod = "init",destroyMethod = "destroy")
- 通过让Bean实现InitializingBean(定义初始化逻辑)、DisposableBean(定义销毁逻辑)
- 可以使用JSR250规范的两个注解:
- @PostConstruct 在Bean创建完并且属性值赋值完执行
- @PreDestroy 在Bean销毁之前
- BeanPostProcessor:bean的后置处理器,在bean初始化(init)前后进行处理工作
- postProcessBeforeInitialization 在bean初始化之前
- postProcessAfterInitialization 在bean初始化之后
12.1 【xml】
<bean id="pension" class="com.hw.springannotation.beans.Pension" scope="prototype" init-method="" destroy-method="">
<property name="name" value="hw"></property>
<property name="age" value="18"></property>
</bean>
12.2 【注解】
@Bean(initMethod = "init",destroyMethod = "destroy")
public Car car() {
return new Car();
}
Car实体类中添加相应的init() 和destroy()方法
package com.hw.springannotation.beans;
/**
* @Description TODO
* @Author hw
* @Date 2018/11/28 16:58
* @Version 1.0
*/
public class Car {
public Car() {
System.out.println("Car construct...");
}
public void init(){
System.out.println("Car init ...");
}
public void destroy(){
System.out.println("Car destroy ...");
}
}
12.3 测试
package com.hw.springannotation.test;
import com.hw.springannotation.config.MainConfigOfLifeCycle;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* @Description TODO
* @Author hw
* @Date 2018/11/28 17:01
* @Version 1.0
*/
public class Test_LifeCycle {
/**
* 创建IOC容器
*/
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
@Test
public void test() {
System.out.println("IOC容器创建完成...");
// 关闭容器
applicationContext.close();
}
}
控制台打印:
多实例的情况下: