Spring注解驱动开发——bean的生命周期

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/rubulai/article/details/80412656

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属性指定的方法

猜你喜欢

转载自blog.csdn.net/rubulai/article/details/80412656