天天看點

spring4 bean的作用域scope 建立及生命周期spring4 bean的作用域scope 建立及生命周期

spring4 bean的作用域scope 建立及生命周期

Spring 的bean是建構Spring應用中很重要的一部分,了解Spring Bean的相關細節對于解讀Spring架構很重要。

  • 1、Spring4 bean 作用域scope
  • 2、bean建立的三種方式
  • 3、ApplicationContext容器中的bean 生命周期
  • 4、BeanFactory容器中的bean 生命周期

1、Spring4 bean 的作用域scope

通過使用Bean定義來指定執行個體的作用域(scope),而不需要在Java的類級别來完成這個任務,這種方法非常強大和靈活。Spring架構現有五種作用域,其中有三個需要在使用Web相關的ApplicationContext環境下才可以使用。

1.1 singleton:預設的作用域,僅為每個Bean對象建立一個執行個體

把一個bean定義設定為singlton作用域時,Spring IoC容器隻會建立該bean定義的唯一執行個體。這個單一執行個體會被存儲到單例緩存(singleton cache)中,并且所有針對該bean的後續請求和引用都将傳回被緩存的對象執行個體。

1.2 prototype:可以根據需要為每個Bean對象建立多個執行個體

Prototype作用域的bean會導緻在每次對該bean請求(将其注入到另一個bean中,或者以程式的方式調用容器的getBean()方法)時都會建立一個新的bean執行個體。根據經驗,對所有有狀态的bean應該使用prototype作用域,而對無狀态的bean則應該使用singleton作用域。

請注意,典型情況下,DAO不會被配置成prototype,因為一個典型的DAO不會持有任何會話狀态,是以應該使用singleton作用域。

1.3 web作用域

1.3.1 request:為每個HTTP請求建立它自有的一個Bean執行個體,僅在Web相關的ApplicationContext中生效。

1.3.2 session:為每個HTTP會話建立一個執行個體,僅在Web相關的ApplicationContext中生效。

1.3.3 global session:為每個全局的HTTP會話建立一個執行個體。一般僅在porlet上下文中用生效。同時僅在Web相關的ApplicationContext中生效。

2、bean建立的三種方式

2.1 調用構造器建立Bean

2.2調用靜态工廠方法建立Bean

2.3調用執行個體工廠方法建立Bean

3、ApplicationContext容器中的bean 生命周期

BeanFactory和ApplicationContext是Spring兩種很重要的容器,前者提供了最基本的依賴注入的支援,而後者在繼承前者的基礎進行了功能的拓展,例如增加了事件傳播,資源通路和國際化的消息通路等功能。分别介紹ApplicationContext和BeanFactory兩種容器的Bean的生命周期。

spring4 bean的作用域scope 建立及生命周期spring4 bean的作用域scope 建立及生命周期

ApplicationContext容器中,Bean的生命周期流程如上圖所示,流程大緻如下:

1.首先容器啟動後,會對scope為singleton且非懶加載的bean進行執行個體化,

2.按照Bean定義資訊配置資訊,注入所有的屬性,

3.如果Bean實作了BeanNameAware接口,會回調該接口的setBeanName()方法,傳入該Bean的id,此時該Bean就獲得了自己在配置檔案中的id,

4.如果Bean實作了BeanFactoryAware接口,會回調該接口的setBeanFactory()方法,傳入該Bean的BeanFactory,這樣該Bean就獲得了自己所在的BeanFactory,

5.如果Bean實作了ApplicationContextAware接口,會回調該接口的setApplicationContext()方法,傳入該Bean的ApplicationContext,這樣該Bean就獲得了自己所在的ApplicationContext,

6.如果有Bean實作了BeanPostProcessor接口,則會回調該接口的postProcessBeforeInitialzation()方法,

7.如果Bean實作了InitializingBean接口,則會回調該接口的afterPropertiesSet()方法,

8.如果Bean配置了init-method方法,則會執行init-method配置的方法,

9.如果有Bean實作了BeanPostProcessor接口,則會回調該接口的postProcessAfterInitialization()方法,

10.經過流程9之後,就可以正式使用該Bean了,對于scope為singleton的Bean,Spring的ioc容器中會緩存一份該bean的執行個體,而對于scope為prototype的Bean,每次被調用都會new一個新的對象,期生命周期就交給調用方管理了,不再是Spring容器進行管理了

11.容器關閉後,如果Bean實作了DisposableBean接口,則會回調該接口的destroy()方法,

12.如果Bean配置了destroy-method方法,則會執行destroy-method配置的方法,至此,整個Bean的生命周期結束

3、BeanFactory容器中的bean 生命周期

spring4 bean的作用域scope 建立及生命周期spring4 bean的作用域scope 建立及生命周期

BeanFactoty容器中, Bean的生命周期如上圖所示,與ApplicationContext相比,有如下幾點不同:

1.BeanFactory容器中,不會調用ApplicationContextAware接口的setApplicationContext()方法,

2.BeanPostProcessor接口的postProcessBeforeInitialzation()方法和postProcessAfterInitialization()方法不會自動調用,必須自己通過代碼手動注冊

3.BeanFactory容器啟動的時候,不會去執行個體化所有Bean,包括所有scope為singleton且非懶加載的Bean也是一樣,而是在調用的時候去執行個體化。