Bean的生命周期:bean创建->初始化->销毁的过程,由容器来管理,容器会在bean进行到当前生命周期时调用我们自定义的初始化和销毁方法
1、通过@Bean的属性指定初始化和销毁方法:这两个方法必须是无入参的
public class Car {
public Car(){
System.out.println("构造");
}
public void init(){
System.out.println("初始化");
}
public void destroy(){
System.out.println("销毁");
}
}
容器Bean:
@Configuration
public class LifeCycleConfig {
@Bean(initMethod="init",destroyMethod="destroy")
public Car car(){
return new Car();
}
}
对于单实例的Bean来说:容器启动时就会调用该Bean的构造器和初始化方法,销毁方法会在容器关闭的时候调用
对于其他类型的Bean来说:容器会在获取Bean时调用完构造器之后调用其初始化方法,但是容器不会销毁多实例Bean
public class MainTest {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(LifeCycleConfig.class);
@Test
public void test1(){
context.close();
}
}
注意上面的context.close()方法并不是在ApplicationContext接口中定义的,而是在其子类中定义的
这样我们就可以在Bean的初始化和销毁时执行一些逻辑,比如数据源的开启和关闭
2、让Bean实现InitializingBean和DisposableBean两个接口
public class Car implements InitializingBean,DisposableBean{
public Car(){
System.out.println("构造");
}
public void afterPropertiesSet() throws Exception {
System.out.println("初始化");
}
public void destroy() throws Exception {
System.out.println("销毁");
}
}
这样容器在调用完构造器之后就会接着调用该Bean的afterPropertiesSet方法完成初始化,如果为单例Bean,在容器关闭时会调用destroy方法执行销毁逻辑
3、使用@PostConstruct和@PreDestroy注解
public class Car {
public Car() {
}
@PostConstruct
public void init() {
}
@PreDestroy
public void destroy() {
}
}
@PostConstruct:在执行完构造器并且对象的所有属性被赋值之后调用
@PreDestroy:在对象销毁之前调用,相当于销毁前的通知方法
在Bean创建和初始化时的执行顺序:构造器->@PostConstruct注解的方法->InitializingBean接口的afterPropertiesSet->@Bean的initMethod属性指定的方法
在Bean销毁时的调用顺序:@PreDestroy注解的方法->DisposableBean接口的destroy方法->@Bean的destroyMethod属性指定的方法