1. 程式人生 > >Spring(三)---容器與生命週期

Spring(三)---容器與生命週期

所謂裝配(wiring),就是將元件狀態到Spring容器中,並且在這些元件建立聯絡。

(一)BeanFactory vs ApplicationContext

Spring有兩種容器:BeanFactory,ApplicationContext.其中ApplicationContext是BeanFactory的子介面。

BeanFactory使用工廠模式,用來建立和分配bean,它面向簡單應用,常常用到的XmlBeanFactory是BeanFactory的一個重要實現,它應用於使用xml檔案進行配置bean的應用。另外BeanFactory也參與Bean的生命週期,包含呼叫初始化和消亡相關的方法。

相關的方法舉例:

BeanFactory beanFactory = new XmlBeanFactory(new FileInputStream("hello.xml"));

AClass aObject = (AClass)beanFactory.getBean("aId");

這樣,aId對應的bean在Spring容器中的生命週期就開始了。

而ApplicationContext和BeanFactory類似,它有3個常用的實現:ClassPathXmlApplicationContext,FileSystemXmlApplicationContext,XmlWebApplicationContext

而ApplicationContext和BeanFactory的區別在於

1.BeanFactory中,當建立對應的BeanFactory時,bean並不會被構造,它們只會在需要時才會被構造出來;而ApplicationContext會在開始時對所有的單例(Singleton)bean進行預裝載。

2.ApplicationContext還提供了其他的服務,例如,提供解決文字訊息的方法,包含對這些方法的國際化;提供裝載檔案資源的generic方法;可以給bean釋出事件,它具有更強大的功能,因此,在實際應用中使用更多。

(二)bean的生命週期

bean在可用之前,經過的步驟:

1.容器找到bean並進行例項化

2.利用依賴注入,Spring會設定bean的屬性

3.如果Bean實現了BeanNameAware介面,那麼容器會呼叫對應setBeanName()方法

4.如果bean實現了BeanFactoryAware(/ApplicationContextAware)介面,那麼會呼叫對應的setBeanFactory()(setApplicationContext())方法

5.如果這個bean於任何BeanPostProcessor相關,那麼呼叫對應的postProcessorBeforeInitialization()方法

6.如果init-method被指定,那麼對應方法會被呼叫

7.如果bean與任何BeanPostProcessor相關,則呼叫對應的postProcessorAfterInitialization方法會被呼叫

經過這7個步驟後,bean就可以用了

當容器關閉時

1.如果bean實現了DisposableBean,那麼對應的destroy()方法將被呼叫

2.如果destroy-method被指定,那麼對應方法將被呼叫

經過這兩步,bean就被銷燬了