bean生命周期:bean创建 – 初始化 – 销毁
容器管理bean的生命周期
可自定义初始化和销毁方法:容器在bean进行到当前生命周期的时候来调用自定义的初始化和销毁方法
package com.example.annotations.bean;
public class Car {
public Car() {
System.out.println("car constructor ...");
}
/**
* 做初始化方法
* 初始化方法不可以有参数 但可以抛异常
*/
public void init() {
System.out.println("car init ...");
}
/**
* 做销毁方法
* 销毁方法不可以有参数 但可以抛异常
*/
public void destroy() {
System.out.println("car destroy ...");
}
}
指定初始化和销毁方法(传统方式)
beans.xml
<bean id="bean_xml_car" class="com.example.annotations.bean.Car" init-method="init" destroy-method="destroy"/>
使用注解
scope采用默认
@Configuration
public class MainConfigOfLifeCycle {
@Bean(initMethod = "init" ,destroyMethod = "destroy")
public Car car(){
return new Car();
}
}
测试
@Test
void lifeCycleTest(){
//配置类测试
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
System.out.println("容器创建完毕");
}
测试结果
现在test中容器关闭
@Test
void lifeCycleTest(){
//配置类测试
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
System.out.println("容器创建完毕");
//关闭容器
applicationContext.close();
}
scope改为prototype
MainConfigOfLifeCycle
@Configuration
public class MainConfigOfLifeCycle {
@Bean(value = "car4LifeCycle",initMethod = "init" ,destroyMethod = "destroy")
@Scope("prototype")
public Car car(){
return new Car();
}
}
测试
@Test
void lifeCycleTest(){
//配置类测试
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
System.out.println("容器创建完毕");
//关闭容器
applicationContext.close();
}
测试结果
手动获取bean
test
@Test
void lifeCycleTest(){
//配置类测试
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
System.out.println("容器创建完毕");
//获取bean
System.out.println("准备获取bean");
Object car4LifeCycle = applicationContext.getBean("car4LifeCycle");
System.out.println("获取完毕");
//关闭容器
applicationContext.close();
System.out.println("容器已关闭");
}
运行结果
可看出,prototype下 不会调用销语句
Notes
构造(对象创建)
- 单实例:容器启动的时候创建对象
- 多实例:每次获取的时候创建对象
初始化
对象创建完成并赋值完成 调用初始化方法
销毁
- 单实例:容器关闭的时候
- 多实例:容器不会管理这个bean;销毁方法不会由容器调用
单实例
- 容器启动的时候创建对象
- 会在创建容器完毕前 获取bean并完成初始化方法
- 容器关闭的时候会调用bean的销毁方法
多实例
- 容器创建的时候并不会创建或者调用初始化
- 每次获取的时候创建对象 调用初始化
- 销毁:容器不会管理这个bean,销毁方法不会由容器来调用