自從年初看了李剛寫的那本《Spring2.0寶典》,好久沒看過Spring任何資料,對于《Spring2.0寶典》的評價,我只能說一句話垃圾中的垃圾。我已經(jīng)不敢再買國內(nèi)作家寫的書了。
在Spring中,兩個最基本最重要的包是 org.springframework.beans 和 org.springframework.context. 這兩個包中的代碼為Spring的反向控制 特性(也叫作依賴注射)提供了基礎(chǔ)。 BeanFactory提供了一種先進的配置機制來管理任何種類bean(對象),這種配置機制考慮到任何一種可能的存儲方式。 ApplicationContext建立在BeanFactory之上,并增加了其他的功能,比如更容易同Spring AOP特性整合, 消息資源處理(用于國際化),事件傳遞,以聲明的方式創(chuàng)建ApplicationContext, 可選的父上下文和與應(yīng)用層相關(guān)的上下文(比如WebApplicationContext),以及其他方面的增強。
簡而言之,BeanFactory提供了配置框架和基本的功能, 而 ApplicationContext為
它增加了更強的功能,這些功能中的一些或許更加接近J2EE并且圍繞企業(yè)級應(yīng)用。一般來說,ApplicationContext是
BeanFactory的完全超集, 任何BeanFactory功能和行為的描述也同樣被認(rèn)為適用于ApplicationContext
用戶有時不能確定BeanFactory和ApplicationContext中哪一個在特定場合下更適合。 通常大部分在J2EE環(huán)境的應(yīng)用中,最好選擇使用ApplicationContext,
因為它不僅提供了BeanFactory所有的特性以及它自己附加的特性,而且還提供以聲明的方式使用一些功能,
這通常是令人滿意的。BeanFactory主要是在非常關(guān)注內(nèi)存使用的情況下
(比如在一個每kb都要計算的applet中)使用,而且你也不需要用到ApplicationContext的所有特性。
這一章粗略地分為兩部分,第一部分包括對BeanFactory和ApplicationContext都適用的一些基本原則。第二部分包括僅僅適用于ApplicationContext的一些特性
生成BeanFactory的方法
InputStream is = new FileInputStream("beans.xml");
XmlBeanFactory factory = new XmlBeanFactory(is);
//或者
ClassPathResource res = new ClassPathResource("beans.xml");
XmlBeanFactory factory = new XmlBeanFactory(res);
生成ApplicationContext方法
ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(
new String[] {"applicationContext.xml", "applicationContext-part2.xml"});
ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext("");
applicationContxt是可以轉(zhuǎn)換成beanFactory的
BeanFactory factory = (BeanFactory) appContext;
Beans被定義為兩種部署模式中的一種:singleton或non-singleton。 (后一種也別叫作prototype,盡管這個名詞用的不精確因為它并不是非常適合)。 如果一個bean是singleton形態(tài)的,那么就只有一個共享的實例存在, 所有和這個bean定義的id符合的bean請求都會返回這個唯一的、特定的實例。
如果bean以non-singleton,prototype模式部署的話,對這個bean的每次請求都會創(chuàng)建一個新的bean實例。這對于例如每個user需要一個獨立的user對象這樣的情況是非常理想的。
<bean id="exampleBean"
class="examples.ExampleBean" singleton="false"/>
<bean name="yetAnotherExample"
class="examples.ExampleBeanTwo" singleton="true"/>