Spring boot bean的生命周期和作用域

  • spring通过我们的配置,如@ComponentScan定义的扫描路径去找到带有@Component的类,这个过程就是一个资源定位的过程。
  • 一旦找到资源,那么它就开始解析,并将定义的信息保存起来,注意,此时还没有初始化bean,也就没有bean的实例,它有的仅仅是bean的定义。
  • 然后就会把bean定义发布到Spring IoC容器中。此时,IoC容器也只有bean的定义,还是没有bean的实例生成。
  • 整个ioc容器初始化bean的过程
    • Spring对bean进行实例化,默认bean是单例;
    • Spring对bean进行依赖注入,按照Spring上下文对实例化的Bean进行配置--也就是IOC注入;
    • 如果Bean实现了BeanNameAware接口,会调用它实现的setBeanName(String)方法,此处传递的就是Spring配置文件中Bean的id值;
    • 如果Bean实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(setBeanFactory(BeanFactory)传递的是Spring工厂自身(可以用这个方式来获取其它Bean,只需在Spring配置文件中配置一个普通的Bean就可以);
    • 如果Bean实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文(同样这个方式也可以实现步骤4的内容,但比4更好,因为ApplicationContext是BeanFactory的子接口,有更多的实现方法)
    • 如果bean实现了BeanPostProcessor接口,它的postProcessBeforeInitialization方法将被调用,用于bean的修改和扩展;
    • 如果bean实现了InitializingBean接口,spring将调用它的afterPropertiesSet接口方法,类似的如果bean使用了init-method属性声明了初始化方法,该方法也会被调用;
    • 如果bean实现了BeanPostProcessor接口,它的postProcessAfterInitialization接口方法将被调用;
    • 此时bean已经准备就绪,可以被应用程序使用了,他们将一直驻留在应用上下文中,直到该应用上下文被销毁;
    • 若bean实现了DisposableBean接口,spring将调用它的distroy()接口方法。同样的,如果bean使用了destroy-method属性声明了销毁方法,则该方法被调用;
  • Bean的作用域@socpe()

猜你喜欢

转载自blog.csdn.net/wzEminem/article/details/94437208