自己雖然研究過一點Spring,也寫過一點利用Spring的代碼,但是從來沒有認真的從頭到尾的研究過Spring,導致其中細節概念混亂,再看到第7章,Spring框架簡介時,又體會到了這一點,希望能夠盡快抽出時間,能夠詳細閱讀有關Spring的文章和書籍,從中體會和理解
IoC的“精神”和Spring的“細節”。
1、核心bean工廠 1.1 基礎接口:
BeanFactory
ListableBeanFactory(只可用于當前的工廠實例,而不能進入工廠的層級體系)
beanFacoryUtils(可以遍歷整個工廠體系)
1.2 通過XML組裝bean:
定義bean組件(借助標準的java.beans.PropertyEditor機制,bean工廠可以自動把String類型的值轉換為適當的類型)
訪問bean組件(
a:XmlBeanFactory、
b:DefaultlistableBeanFactory和XmlBeanDefinitionReader)
1.3 非XML格式的Bean聲明
讀取屬性文件或資源包(PropertiesBeanDefinitionReader)
編程方式注冊(RootBeanDefinition和MutablePropertyValues)
1.4 組裝應用對象
bean工廠可以根據bean屬性中描述的對象依賴來組裝(wire)bean實例,使得Spring容器能夠對受管對象進行依賴決議(dependency resolving)
1.5 自動裝配(autowire)
byType、byName,推薦byType(出錯可能小)
1.6 依賴檢查(dependency checking)
<bean id ="****" class="" autowire="byType" dependency-check="objects">
.</bean> 值為“object”時,表示只做對象間關聯的檢查;
值為“simple”時,表示只檢查基本類型的屬性(原始類型或者String);
值為“all”時,表示檢查所有的類型;
值為“none”,表示不進行依賴檢查;
1.7 生命周期回調
在bean組件聲明中指定回調方法
<bean id="*****" class="****" init-method="initialize" destory-method="shutdown"/>
***類只需提供無參數、訪問級別為public的initialize和shutdown兩個方法即可,不必實現任何Spring特有的接口(不依賴Spring)。
只要有可能,應該盡量使用JavaBean的屬性或者構造子參數,而不是實現Spring生命周期方法。
1.8 復雜的屬性值
數組和List組裝方式一樣;
1 <property name="myArrayList">
2 <list>
3 <ref bean="ABean"/>
4 <ref bean="BBean"/>
5 <value>myArrayValue</value>
6 <value>myListValue</value>
7 </list>
8 </property>
Map和Properties都一個Key值,但是不一樣(廢話一句);
1 <property name="myMap">
2 <map>
3 <entry key="myMapKey">
4 <ref bean="myBean"/>
5 </entry>
6 <entry key="yourMapKey">
7 <value>yourMapValue</value>
8 </entry>
9 </map>
10 </property>
1 <property name="myProperties">
2 <props>
3 <prop key="myPropKey">
4 myPropValue
5 </prop>
6 <prop key="yourPropKey">
7 yourPropValue
8 </prop>
9 </props>
10 </property>
2、工廠bean 2.1 工廠bean(factory bean)-- 它們實現了org.springframework.beans.factory.FactoryBean接口;
public interface FactoryBean{
object getObject() throws Exception;
Class getObjectType();
boolean isSingleton();
}
2.2 Spring內建的資源工廠,包括:
2.2.1 org.springframework.jndi.JndiObjectFactoryBean:一個通用的工廠bean,通過JNDI查找而獲得的對象。JNDI查找由Spring--而不是應用代碼--來執行;
2.2.2 org.springframework.orm.hibernate.LocalSessionFactoryBean:用于在本地裝配Hibernate SessionFactory的工廠bean;
2.2.3 org.springframework.aop.framework.ProxyFactoryBean:一個通用的工廠bean,用于獲得AOP代理。
2.2.4 org.springframework.transaction.interceptor.TransactionProxyFactoryBean:用于為對象創建事務代理,用于實現簡捷易用的聲明性食物管理;
2.2.5 org.springframework.remoting.rmi.RmiProxyFactoryBean:這個工廠bean可以為通過RMI訪問的遠程對象創建一個代理;
以上為常用的,不常用的不列了......
3、Spring 應用上下文
應用上下文是應用程序的中心注冊機構。
3.1 除了支持bean工廠的全部功能之外,應用上下文還具備了下列功能:
*支持不同信息源。可以用統一的方式根據鍵獲得本地化的信息,而不依賴地稱的信息來源。默認的實現是從資源綁定中讀取信息。
*訪問文件資源。不依賴于實際資源環境(例如文件系統或ServletContext)的情況下,根據相對路徑載入資源。
*支持應用事件。監聽器(Spring AOP框架可以作為“事件-監聽”機制的替代品)。
3.2 訪問信息源以及訪問文件資源,引用對象依賴更專用的接口--org.springframework.context.ResourceLoaderAware接口--即可。
3.3 信息源,在應用上下文聲明一個名為messageSource的MessageSourc對象,默認實現是ResourceBundleMessageSource,它對標準的java.util.ResourceBundle進行了封裝,它唯一需要的參數是basename,也就是資源包的文件名--只讀取一次,放入緩存;也提供了“ReloadableResourceBundleMessageSource”(可重新加載)。
3.4 文件資源
實現ResourceLoadAware接口。
3.5 Bean Factory 后處理
----------