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就被銷燬了