Bean 的作用域
Spring Bean作用域有一下几个:
平时直接使用@Component
或者@Service
,默认的作用域都是Singleton
,即从容器启动到停止,这个Bean都是单例的。
可以使用@Scope
注解去声明一个bean的作用域:
@Component
@Scope("prototype")
public class Person {
// field...
@PostConstruct
public void init(){
System.out.println("我是初始化方法");
}
@PreDestroy
public void destroy(){
System.out.println("我是销毁方法");
}
}
@PostConstruct
和@PreDestroy
看上面示例代码,知道这两个注解应用的方法是Bean创建和销毁过程中会执行的。
@PostConstruct
是bean创建(构造函数执行)之后执行@PreDestroy
是bean销毁之前执行
需要注意的是,默认的Singleton
作用域是不会销毁的,除非容器停止。
Bean的生命周期
- Spring 对 Bean 进行实例化;
- Spring 将值和 Bean 的引用注入到 Bean 对应属性中;
- 若 Bean 实现了 BeanNameAware 接口,则 Spring 将 Bean 的 ID 传递给 setBeanName() 方法;
- 若 Bean 实现了 BeanFactoryAware 接口,Spring 将调用 setBeanFactory() 方法,将 Bean 所在应用引用传入进来;
- 若 Bean 实现了 ApplicationContextAware 接口,Spring 将调用 setApplicationContext() 方法,将 Bean 所在应用的引用传入进来;
- 若 Bean 实现了 BeanPostProcessor 接口,Spring 将调用 post-ProcessBeforeInitalization() 方法;
- 若 Bean 实现了 InitializingBean 接口,Spring 将调用他们的 after-PropertiesSet() 方法,类似地,如果 Bean 使用 init-method 声明了初始化方法,则该方法也会被调用;
- 若 Bean 实现了 BeanPostProcessor 接口,Spring 将调用他们的 post-ProcessAfterInitialization() 方法;
- 此时,Bean 已经准备就绪,我们就可以被应用程序使用,他们将一直驻留在应用上下文中,直到该应用被销毁;
- 若 Bean 实现了 DisposableBean 接口,Spring 将调用它的 destory() 接口方法;同样,若 Bean 使用 destroy-method 声明了销毁方法,该方法也将被调用;