在Spring中,含有兩個(gè)重要的Container,用于管理這些javabean他們是BeanFactory和ApplicationContext。其中ApplicationContext繼承了BeanFactory的所有功能,還提供了i18n、統(tǒng)一載入資源、事件分發(fā)等功能。
在BeanFactory中,所有的bean對(duì)象的創(chuàng)建都是lazy的,包括那些singleton bean。只有javabean對(duì)象必須被使用的時(shí)候,才會(huì)創(chuàng)建該對(duì)象,才會(huì)正式的解析相應(yīng)的xml標(biāo)記,解析該bean的property等。但是在ApplicationContext,它可以預(yù)先載入sigleton bean,而不是直到使用時(shí)才創(chuàng)建。
BeanFactory最常用的實(shí)現(xiàn)是XmlBeanFactory,載入“定位xml”文件:
BeanFactory factory = new XmlBeanFactory(new FileInputStream("beans.xml"));
ApplicationContext有三種實(shí)現(xiàn):ClassPathXmlApplicationContext,FileSystemXmlApplicationContext,XmlWebApplicationContext。其中前兩者也是基于路徑的,和BeanFactory的xml文件定位方式一致。
ApplicationContext context =new FileSystemXmlApplicationContext("c:/foo.xml");
ApplicationContext context = new ClassPathXmlApplicationContext("foo.xml");
BeanFactory管理Bean對(duì)象的生命周期:
1、 使用構(gòu)造函數(shù)創(chuàng)建Bean對(duì)象
2、 Bean對(duì)象autowire被執(zhí)行
3、 Bean對(duì)象調(diào)用各項(xiàng)setXXX方法
4、 如果該Bean實(shí)現(xiàn)了BeanNameAware接口,則調(diào)用該對(duì)象的setBeanName()方法,設(shè)置其ID(已經(jīng)在xml配置文件中寫(xiě)好了)
5、 如果該Bean實(shí)現(xiàn)了BeanFactoryAware接口,則調(diào)用該對(duì)象的setBeanFactory()方法,傳入BeanFactory對(duì)象自身
6、 如果已經(jīng)配置了BeanPostProcessor,那么調(diào)用BeanPostProcessors的pre-
ProcessBeforeInitialization()方法,對(duì)該Bean對(duì)象進(jìn)行處理;
7、 如果該bean自定義了init()方法,那么調(diào)用此方法
8、 如果已經(jīng)配置了BeanPostProcessor,那么調(diào)用該BeanPostProcessors的post
ProcessBeforeInitialization()方法,對(duì)該Bean對(duì)象進(jìn)行處理
9、 正常使用
10、 系統(tǒng)銷(xiāo)毀,如果該bean對(duì)象實(shí)現(xiàn)了DisposableBean接口,則調(diào)用其destory()方法,
11、 最后調(diào)用用戶在配置文件中編寫(xiě)的destroy-method