Spring Bean的作用域(scope)和生命周期

Administrator
Administrator
发布于 2021-01-04 / 227 阅读
0
0

Spring Bean的作用域(scope)和生命周期

Bean 的作用域

Spring Bean作用域有一下几个:
image.png

平时直接使用@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的生命周期

  1. Spring 对 Bean 进行实例化;
  2. Spring 将值和 Bean 的引用注入到 Bean 对应属性中;
  3. 若 Bean 实现了 BeanNameAware 接口,则 Spring 将 Bean 的 ID 传递给 setBeanName() 方法;
  4. 若 Bean 实现了 BeanFactoryAware 接口,Spring 将调用 setBeanFactory() 方法,将 Bean 所在应用引用传入进来;
  5. 若 Bean 实现了 ApplicationContextAware 接口,Spring 将调用 setApplicationContext() 方法,将 Bean 所在应用的引用传入进来;
  6. 若 Bean 实现了 BeanPostProcessor 接口,Spring 将调用 post-ProcessBeforeInitalization() 方法;
  7. 若 Bean 实现了 InitializingBean 接口,Spring 将调用他们的 after-PropertiesSet() 方法,类似地,如果 Bean 使用 init-method 声明了初始化方法,则该方法也会被调用;
  8. 若 Bean 实现了 BeanPostProcessor 接口,Spring 将调用他们的 post-ProcessAfterInitialization() 方法;
  9. 此时,Bean 已经准备就绪,我们就可以被应用程序使用,他们将一直驻留在应用上下文中,直到该应用被销毁;
  10. 若 Bean 实现了 DisposableBean 接口,Spring 将调用它的 destory() 接口方法;同样,若 Bean 使用 destroy-method 声明了销毁方法,该方法也将被调用;

参考

快来瞧瞧这份 Spring 面试小抄!


评论