標籤:class moni 工廠 載入 檔案 擷取 single style 作用
什麼是Spring呢?
Spring是為瞭解決公司專屬應用程式開發的複雜性而建立的一個輕量級的控制反轉(IoC)和面向切面(AOP)的容器架構。
Spring優點
簡單瞭解Spring之後,我們看一下Spring的優點。
1、方便解耦,簡化開發。
2、AOP編程的支援。
3、聲明式事務的支援。
4、方便程式的測試。。
5、方便整合各種優秀架構。
6、降低Java EE API的使用難度。
Spring的骨骼架構
Spring總共有十幾個組件,但是真正核心組件只有三個:Core、Context和Beans。
沒有它們就不可能有AOP、Web、ORM等上層的擴充的特性功能。
Spring的設計理念
Spring的三個核心組件,Bean比作一場演出中的演員的話,那Context就是這場演出的舞台背景,而Core應該就是演出的道具了。
三個核心組件中最核心那就非Beans組件莫屬了,因為Spring就是面向Bean的編程(BOP,Bean Oriented Programming),Bean在Spring 中才是真正的主角。Bean在Spring中作用就像Object對OOP的意義一樣。
Bean封裝的是Object,而Object必然有資料,如何給這些資料提供生存環境就是Context要解決的問題,對Context來說他就是要發現每個Bean之間的關係,為它們建立這種關係並且要維護好 這種關係。
Core就是發現、建立和維護每 個Bean之間的關係所需要的一些列的工具,從這個角度看來,Core這個組件叫Util更能讓你理解。
Bean組件
org.springframework.beans包下,這個包下的所有類主要解決了三件事:對Bean 的建立、Bean的定義、Bean的解析。
對Spring的使用者來說唯一需要關心的就是Bean的建立,其他兩個由Spring在內部幫你完成了。
Bean的建立時典型的原廠模式,他的頂級介面是BeanFactory,有三個子類:可列表的ListableBeanFactory、有繼承關係的HierarchicalBeanFactory和自動裝配的Autowire Capable BeanFactory。
最終的預設實作類別是DefaultListableBeanFactory,他實 現了所有的介面。
Bean的定義主要有BeanDefinition描述,就是完整的描述了在Spring的設定檔中你定義的節點中所有的資訊,包括各種子節點。
當Spring成功解析你定義的一個節點後,在Spring的內部他就被轉化 成BeanDefinition對象。
Bean的解析過程非常複雜,功能被分的很細,因為這裡需要被擴充的地方很多,Bean的解析主要就是對Spring設定檔的解析。
Context組件
org.springframework.context包下,Context組件在Spring中的作用,實際上就是給Spring提供一個運行時的環境。
ApplicationContext是Context組件的頂級父類,ApplicationContext繼承了BeanFactory,這也說明了Spring容器中啟動並執行主體對象是Bean,
另外ApplicationContext繼承了ResourceLoader介面,使得ApplicationContext可以訪 問到任何外部資源,這裡將會使用到Core組建。
ApplicationContext的子類主要有ConfigurableApplicationContext,表示該Context是可修改的,其下面又有一個子類,可更新的Context,即 AbstractRefreshableApplicationContext類。
ApplicationContext的子類還有一個WebApplicationContext,就是為web準備的Context。他可以直接存取到ServletContext,通常情況下,這個介面使用的少。
Core組件
包含了很多的關鍵類,其中一個重要組成部分就是定義了資源的訪問方式。
Resource介面封裝了各種可能的資源類型,也就是對使用者來說屏蔽了檔案類型的不同。
Resource 介面繼承了InputStreamSource介面,這個介面中有個getInputStream方法,返回的是InputStream類。這樣所有的資源都被可以通過InputStream這個類來擷取,所以也屏蔽了資源的提供者。
另外還有一 個,資源的載入者要統一,這個任務是由ResourceLoader介面完成,他屏蔽了所有的資源載入者的差異,只需要實現這個介面就可以載入所有的資源, 他的預設實現是DefaultResourceLoader。
如何建立BeanFactory工廠
Ioc容器實際上就是Context組件結合其他兩個組件共同構建了一個Bean關係網,如何構建這個關係網?
構建的入口就在AbstractApplicationContext類的refresh方法中。
清單1.AbstractApplicationContext.refresh //這個方法就是構建整個Ioc容器過程的完整的代碼,瞭解了裡面的每一行代碼基本上就瞭解大部分Spring的原理和功能了。
- public void refresh() throws BeansException, IllegalStateException {
-
- synchronized (this.startupShutdownMonitor) {
-
- // Prepare this context for refreshing.
-
- prepareRefresh();
-
- // Tell the subclass to refresh the internal bean factory.
-
- ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); //裡面調用loadBeanDefinitions();開始載入、解析 Bean的定義,也就是把使用者定義的資料結構轉化為Ioc容器中的特定資料結構。
-
- // Prepare the bean factory for use in this context.
-
- prepareBeanFactory(beanFactory); //添加一些Spring本身需要的一些工具類
-
- try {
-
- // Allows post- processing of the bean factory in context subclasses.
-
- postProcessBeanFactory(beanFactory); //擴充了Spring的功能: 讓你現在可以對已經構建的BeanFactory的配置做修改
-
- // Invoke factory processors registered as beans in& nbsp;the context.
-
- invokeBeanFactoryPostProcessors(beanFactory); //擴充了Spring的功能: 讓你現在可以對已經構建的BeanFactory的配置做修改
-
- // Register bean processors that intercept bean crea tion.
-
- registerBeanPostProcessors (beanFactory); //擴充了Spring的功能: 讓你可以對以後再 建立Bean的執行個體對象時添加一些自訂的操作
-
- // Initialize message source for this context.
-
- initMessageSource();
-
- // Initialize event multicaster for this context.
-
- initApplicationEventMulticaster();
-
- // Initialize other special beans in specific contex t subclasses.
-
- onRefresh();
-
- // Check for listener beans and register them.
-
- registerListeners();
-
- // Instantiate all remaining (non-lazy-init) singletons.
-
- finishBeanFactoryInitialization (beanFactory); //Bean的執行個體化
-
- // Last step: publish corresponding event.
-
- finishRefresh();
-
- }
-
- catch (BeansException ex) {
- 略
- }
-
- }
一個非常重要的Bean——FactoryBean,
可以說Spring一大半的擴充的功能都與這個Bean有關,這是個特殊的Bean他是個工廠Bean,可以產生Bean的Bean,這裡的產生Bean是指 Bean的執行個體,
如果一個類繼承FactoryBean,使用者可以自己定義產生執行個體對象的方法只要實現他的getObject方法。
然後在Spring內部這個Bean的執行個體對象是FactoryBean,通過調用這個對象的getObject方 法就能擷取使用者自訂產生的對象,從而為Spring提供了很好的擴充性。Spring擷取FactoryBean本身的對象是在前面加上&來完成的。
Ioc容器的擴充點
如何讓這些Bean對象有一定的擴充性,就是可以加入使用者的一些操作。
BeanFactoryPostProcessor,BeanPostProcessor。他們分別是在構建BeanFactory和構建Bean對象時調用。
還有就是InitializingBean和DisposableBean 他們分別是在Bean執行個體建立和銷毀時被調用。使用者可以實現這些介面中定義的方法,Spring就會在適當的時候調用他們。
還有一個是FactoryBean他是個特殊的Bean,這個Bean可以被使用者更多的控制。
如何精通Spring就看你有沒有掌握好Spring有哪些擴充點,並且如何使用他們,要知道如何使用他們就必須瞭解他們內在的機理。
把Ioc容器比作一個箱子,
這個箱子裡有若干個球的模子,可以用這些模子來造很多種不同的球,
還有一個造這些球模的機器,這個機器可以產生球模。
那麼他們的對應關係就是BeanFactory就是 那個造球模的機器,
球模就是Bean,
而球模造出來的球就是Bean的執行個體。
那前面所說的幾個擴充點又在什麼地方呢?
BeanFactoryPostProcessor對應到當造球模被造出來時,你將有機會可以對其做出設 當的修正,也就是他可以幫你修改球模。
而InitializingBean和DisposableBean是在球模造球的開始和結束階段,你可以完成一些預備和掃尾工作。
BeanPostProcessor就可以讓你對球模造出來的球做出 適當的修正。
最後還有一個FactoryBean,它可是一個神奇的自訂球模。這個球模不是預先就定型了,而是由你來給他確定它的形狀,既然你可以確定這個球模型的形狀,當然他造出來的球肯定就是你想要的 球了,這樣在這個箱子裡尼可以發現所有你想要的球。
SpringAOP如何?
動態代理的實現原理
Jdk動態代理
CGLIB類代理
參考資料:
http://developer.51cto.com/art/201006/205212_all.htm
深入理解java:4.2. 架構編程之Spring架構的設計理念