Spring Bean容器

weixin_33866037發表於2019-01-16

Spring核心容器

Spring的核心是容器,而容器並不唯一,框架本身就提供了很多個容器的實現,大概分為兩種型別:一種是不常用的BeanFactory,這是最簡單的容器,只能提供基本的DI功能;還有一種就是繼承了BeanFactory後派生而來的應用上下文,其抽象介面也就是我們上面提到的的ApplicationContext,它能提供更多企業級的服務,例如解析配置文字資訊等等,這也是應用上下文例項物件最常見的應用場景。有了上下文物件,我們就能向容器註冊需要Spring管理的物件了。

Spring Bean生命週期

  1. 例項化一個Bean--也就是我們常說的new;

  2. 按照Spring上下文對例項化的Bean進行配置--也就是IOC注入;

  3. 如果這個Bean已經實現了BeanNameAware介面,會呼叫它實現的setBeanName(String)方法,此處傳遞的就是Spring配置檔案中Bean的id值

  4. 如果這個Bean已經實現了BeanFactoryAware介面,會呼叫它實現的setBeanFactory(setBeanFactory(BeanFactory)傳遞的是Spring工廠自身(可以用這個方式來獲取其它Bean,只需在Spring配置檔案中配置一個普通的Bean就可以);

  5. 如果這個Bean已經實現了ApplicationContextAware介面,會呼叫setApplicationContext(ApplicationContext)方法,傳入Spring上下文(同樣這個方式也可以實現步驟4的內容,但比4更好,因為ApplicationContext是BeanFactory的子介面,有更多的實現方法);

  6. 如果這個Bean關聯了BeanPostProcessor介面,將會呼叫postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor經常被用作是Bean內容的更改,並且由於這個是在Bean初始化結束時呼叫那個的方法,也可以被應用於記憶體或快取技術;

  7. 如果Bean在Spring配置檔案中配置了init-method屬性會自動呼叫其配置的初始化方法。

  8. 如果這個Bean關聯了BeanPostProcessor介面,將會呼叫postProcessAfterInitialization(Object obj, String s)方法、;

注:以上工作完成以後就可以應用這個Bean了,那這個Bean是一個Singleton的,所以一般情況下我們呼叫同一個id的Bean會是在內容地址相同的例項,當然在Spring配置檔案中也可以配置非Singleton,這裡我們不做贅述。
  1. 當Bean不再需要時,會經過清理階段,如果Bean實現了DisposableBean這個介面,會呼叫那個其實現的destroy()方法;

  2. 最後,如果這個Bean的Spring配置中配置了destroy-method屬性,會自動呼叫其配置的銷燬方法。

相關文章