1. 程式人生 > >Spring IOC原理總結

Spring IOC原理總結

Spring容器高層檢視

Spring 啟動時讀取應用程式提供的Bean配置資訊,並在Spring容器中生成一份相應的Bean配置登錄檔,然後根據這張登錄檔例項化Bean,裝配好Bean之間的依賴關係,為上層應用提供準備就緒的執行環境。

IOC容器介紹

Spring 通過一個配置檔案描述 Bean 及 Bean 之間的依賴關係,利用 Java 語言的反射功能例項化 Bean 並建立 Bean 之間的依賴關係。 Spring 的 IoC 容器在完成這些底層工作的基礎上,還提供了 Bean 例項快取、生命週期管理、 Bean 例項代理、事件釋出、資源裝載等高階服務。

BeanFactory 是 Spring 框架的基礎設施,面向 Spring 本身;

ApplicationContext 面向使用 Spring 框架的開發者,幾乎所有的應用場合我們都直接使用 ApplicationContext 而非底層的 BeanFactory。

BeanFactory

BeanFactory體系架構:

BeanDefinitionRegistry: Spring 配置檔案中每一個<bean>節點元素在 Spring 容器裡都通過一個 BeanDefinition 物件表示,它描述了 Bean 的配置資訊。而 BeanDefinitionRegistry 介面提供了向容器手工註冊 BeanDefinition 物件的方法。

BeanFactory 介面位於類結構樹的頂端 ,它最主要的方法就是 getBean(String beanName),該方法從容器中返回特定名稱的 Bean,BeanFactory 的功能通過其他的介面得到不斷擴充套件:

ListableBeanFactory:該介面定義了訪問容器中 Bean 基本資訊的若干方法,如檢視Bean 的個數、獲取某一型別 Bean 的配置名、檢視容器中是否包括某一 Bean 等方法;

HierarchicalBeanFactory:父子級聯 IoC 容器的介面,子容器可以通過介面方法訪問父容器; 通過 HierarchicalBeanFactory 介面, Spring 的 IoC 容器可以建立父子層級關聯的容器體系,子容器可以訪問父容器中的 Bean,但父容器不能訪問子容器的 Bean。Spring 使用父子容器實現了很多功能,比如在 Spring MVC 中,展現層 Bean 位於一個子容器中,而業務層和持久層的 Bean 位於父容器中。這樣,展現層 Bean 就可以引用業務層和持久層的 Bean,而業務層和持久層的 Bean 則看不到展現層的 Bean。

ConfigurableBeanFactory:是一個重要的介面,增強了 IoC 容器的可定製性,它定義了設定類裝載器、屬性編輯器、容器初始化後置處理器等方法;

AutowireCapableBeanFactory:定義了將容器中的 Bean 按某種規則(如按名字匹配、按型別匹配等)進行自動裝配的方法;

SingletonBeanRegistry:定義了允許在執行期間向容器註冊單例項 Bean 的方法;

通過 BeanFactory 裝載配置檔案,啟動 Spring IoC 容器:

XmlBeanFactory 通過 Resource 裝載 Spring 配置資訊並啟動 IoC 容器,然後就可以通過 BeanFactory#getBean(beanName)方法從 IoC 容器中獲取 Bean 了。通過 BeanFactory 啟動IoC 容器時,並不會初始化配置檔案中定義的 Bean,初始化動作發生在第一個呼叫時。

對於單例項( singleton)的 Bean 來說,BeanFactory會快取 Bean 例項,所以第二次使用 getBean() 獲取 Bean 時將直接從 IoC 容器的快取中獲取 Bean 例項。Spring 在 DefaultSingletonBeanRegistry 類中提供了一個用於快取單例項 Bean 的快取器,它是一個用HashMap 實現的快取器,單例項的 Bean 以 beanName 為鍵儲存在這個HashMap 中。

值得一提的是,在初始化 BeanFactory 時,必須為其提供一種日誌框架,比如使用Log4J, 即在類路徑下提供 Log4J 配置檔案,這樣啟動 Spring 容器才不會報錯。

ApplicationContext

ApplicationContext 由 BeanFactory 派生而來,提供了更多面向實際應用的功能。

在BeanFactory 中,很多功能需要以程式設計的方式實現,而在 ApplicationContext 中則可以通過配置的方式實現。

ApplicationContext 繼承了 HierarchicalBeanFactory 和 ListableBeanFactory 介面,在此基礎上,還通過多個其他的介面擴充套件了 BeanFactory 的功能:

ClassPathXmlApplicationContext:預設從類路徑載入配置檔案

FileSystemXmlApplicationContext:預設從檔案系統中裝載配置檔案

ApplicationEventPublisher:讓容器擁有釋出應用上下文事件的功能,包括容器啟動事件、關閉事件等。實現了 ApplicationListener 事件監聽介面的 Bean 可以接收到容器事件 , 並對事件進行響應處理 。 在 ApplicationContext 抽象實現類AbstractApplicationContext 中,我們可以發現存在一個 ApplicationEventMulticaster,它負責儲存所有監聽器,以便在容器產生上下文事件時通知這些事件監聽者。

MessageSource:為應用提供 i18n 國際化訊息訪問的功能;

ResourcePatternResolver : 所 有 ApplicationContext 實現類都實現了類似於PathMatchingResourcePatternResolver 的功能,可以通過帶字首的 Ant 風格的資原始檔路徑裝載 Spring 的配置檔案。

LifeCycle:該介面是 Spring 2.0 加入的,該介面提供了 start()和 stop()兩個方法,主要用於控制非同步處理過程。在具體使用時,該介面同時被 ApplicationContext 實現及具體 Bean 實現, ApplicationContext 會將 start/stop 的資訊傳遞給容器中所有實現了該介面的 Bean,以達到管理和控制 JMX、任務排程等目的。

ConfigurableApplicationContext 擴充套件於 ApplicationContext,它新增加了兩個主要的方法: refresh()和 close(),讓 ApplicationContext 具有啟動、重新整理和關閉應用上下文的能力。在應用上下文關閉的情況下呼叫 refresh()即可啟動應用上下文,在已經啟動的狀態下,呼叫 refresh()則清除快取並重新裝載配置資訊,而呼叫close()則可關閉應用上下文。這些介面方法為容器的控制管理帶來了便利,但作為開發者,我們並不需要過多關心這些方法。

使用:

如果配置檔案放置在類路徑下,使用者可以優先使用 ClassPathXmlApplicationContext 實現類:

如果配置檔案放置在檔案系統的路徑下,則可以優先考慮使用 FileSystemXmlApplicationContext 實現類:

Spring 3.0 支援基於類註解的配置方式,主要功能來自於 Spring 的一個名為 JavaConfig 子專案,目前 JavaConfig已經升級為 Spring核心框架的一部分。

ApplicationContext 在初始化應用上下文時就例項化所有單例項的 Bean。

WebApplicationContext

WebApplication體系架構:

WebApplicationContext 是專門為 Web 應用準備的,它允許從相對於 Web 根目錄的路徑中裝載配置檔案完成初始化工作。從WebApplicationContext 中可以獲得 ServletContext 的引用,整個 Web 應用上下文物件將作為屬性放置到 ServletContext 中,以便 Web 應用環境可以訪問 Spring 應用上下文。 WebApplicationContext 定義了一個常量ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,在上下文啟動時, WebApplicationContext 例項即以此為鍵放置在 ServletContext 的屬性列表中,因此我們可以直接通過以下語句從 Web 容器中獲取WebApplicationContext:

Spring 和 Web 應用的上下文融合:

WebApplicationContext 的初始化方式:WebApplicationContext 需要 ServletContext 例項,它必須在擁有 Web 容器的前提下才能完成啟動的工作。可以在 web.xml 中配置自啟動的 Servlet 或定義 Web 容器監聽器( ServletContextListener),藉助這兩者中的任何一個就可以完成啟動 Spring Web 應用上下文的工作。Spring 分別提供了用於啟動 WebApplicationContext 的 Servlet 和 Web 容器監聽器:

org.springframework.web.context.ContextLoaderServlet;

org.springframework.web.context.ContextLoaderListener

由於 WebApplicationContext 需要使用日誌功能,比如日誌框架使用Log4J,使用者可以將 Log4J 的配置檔案放置到類路徑 WEB-INF/classes 下,這時 Log4J 引擎即可順利啟動。如果 Log4J 配置檔案放置在其他位置,使用者還必須在 web.xml 指定 Log4J 配置檔案位置。

Bean的生命週期

1.當呼叫者通過 getBean(beanName)向容器請求某一個 Bean 時,如果容器註冊了org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor 介面,在例項化 Bean 之前,將呼叫介面的 postProcessBeforeInstantiation()方法;

2.根據配置情況呼叫 Bean 建構函式或工廠方法例項化 Bean;

3.如果容器註冊了 InstantiationAwareBeanPostProcessor 介面,在例項化 Bean 之後,呼叫該介面的 postProcessAfterInstantiation()方法,可在這裡對已經例項化的物件進行一些“梳妝打扮”;

4.如果 Bean 配置了屬性資訊,容器在這一步著手將配置值設定到 Bean 對應的屬性中,不過在設定每個屬性之前將先呼叫InstantiationAwareBeanPostProcessor 介面的postProcessPropertyValues()方法;

5.呼叫 Bean 的屬性設定方法設定屬性值;

6.如果 Bean 實現了 org.springframework.beans.factory.BeanNameAware 介面,將呼叫setBeanName()介面方法,將配置檔案中該 Bean 對應的名稱設定到 Bean 中;

7.如果 Bean 實現了 org.springframework.beans.factory.BeanFactoryAware 介面,將呼叫 setBeanFactory()介面方法,將 BeanFactory 容器例項設定到 Bean 中;

8.如果 BeanFactory 裝配了 org.springframework.beans.factory.config.BeanPostProcessor後處理器,將呼叫 BeanPostProcessor 的 Object postProcessBeforeInitialization(Object bean, String beanName)介面方法對 Bean 進行加工操作。其中入參 bean 是當前正在處理的 Bean,而 beanName 是當前 Bean 的配置名,返回的物件為加工處理後的 Bean。使用者可以使用該方法對某些 Bean 進行特殊的處理,甚至改變 Bean 的行為, BeanPostProcessor 在 Spring 框架中佔有重要的地位,為容器提供對 Bean 進行後續加工處理的切入點, Spring 容器所提供的各種“神奇功能”(如 AOP,動態代理等)都通過 BeanPostProcessor 實施;

9.如果 Bean 實現了 InitializingBean 的介面,將呼叫介面的 afterPropertiesSet()方法;

10.如果在<bean>通過 init-method 屬性定義了初始化方法,將執行這個方法;

11.BeanPostProcessor 後處理器定義了兩個方法:其一是 postProcessBeforeInitialization() 在第 8 步呼叫;其二是 Object postProcessAfterInitialization(Object bean, String beanName)方法,這個方法在此時呼叫,容器再次獲得對 Bean 進行加工處理的機會;

12.如果在<bean>中指定 Bean 的作用範圍為 scope=“prototype”,將 Bean 返回給呼叫者,呼叫者負責 Bean 後續生命的管理, Spring 不再管理這個 Bean 的生命週期。如果作用範圍設定為 scope=“singleton”,則將 Bean 放入到 Spring IoC 容器的快取池中,並將 Bean引用返回給呼叫者, Spring 繼續對這些 Bean 進行後續的生命管理;

13.對於 scope=“singleton”的 Bean,當容器關閉時,將觸發 Spring 對 Bean 的後續生命週期的管理工作,首先如果 Bean 實現了 DisposableBean 介面,則將呼叫介面的afterPropertiesSet()方法,可以在此編寫釋放資源、記錄日誌等操作;

14.對於 scope=“singleton”的 Bean,如果通過<bean>的 destroy-method 屬性指定了 Bean 的銷燬方法, Spring 將執行 Bean 的這個方法,完成 Bean 資源的釋放等操作。

可以將這些方法大致劃分為三類:

Bean 自身的方法:如呼叫 Bean 建構函式例項化 Bean,呼叫 Setter 設定 Bean 的屬性值以及通過<bean>的 init-method 和 destroy-method 所指定的方法;

Bean 級生命週期介面方法:如 BeanNameAware、 BeanFactoryAware、 InitializingBean 和 DisposableBean,這些介面方法由 Bean 類直接實現;

容器級生命週期介面方法:在上圖中帶“★” 的步驟是由 InstantiationAwareBean PostProcessor 和BeanPostProcessor 這兩個介面實現,一般稱它們的實現類為“ 後處理器” 。 後處理器介面一般不由 Bean 本身實現,它們獨立於 Bean,實現類以容器附加裝置的形式註冊到 Spring 容器中並通過介面反射為 Spring 容器預先識別。當Spring 容器建立任何 Bean 的時候,這些後處理器都會發生作用,所以這些後處理器的影響是全域性性的。當然,使用者可以通過合理地編寫後處理器,讓其僅對感興趣Bean 進行加工處理

ApplicationContext 和 BeanFactory 另一個最大的不同之處在於:ApplicationContext會利用 Java 反射機制自動識別出配置檔案中定義的 BeanPostProcessor、 InstantiationAwareBeanPostProcessor 和 BeanFactoryPostProcessor,並自動將它們註冊到應用上下文中;而後者需要在程式碼中通過手工呼叫 addBeanPostProcessor()方法進行註冊。這也是為什麼在應用開發時,我們普遍使用 ApplicationContext 而很少使用 BeanFactory 的原因之一

IOC容器工作機制

容器啟動過程

web環境下Spring容器、SpringMVC容器啟動過程:

首先,對於一個web應用,其部署在web容器中,web容器提供其一個全域性的上下文環境,這個上下文就是ServletContext,其為後面的spring IoC容器提供宿主環境;

其次,在web.xml中會提供有contextLoaderListener(或ContextLoaderServlet)。在web容器啟動時,會觸發容器初始化事件,此時contextLoaderListener會監聽到這個事件,其contextInitialized方法會被呼叫,在這個方法中,spring會初始化一個啟動上下文,這個上下文被稱為根上下文,即WebApplicationContext,這是一個介面類,確切的說,其實際的實現類是XmlWebApplicationContext。這個就是spring的IoC容器,其對應的Bean定義的配置由web.xml中的context-param標籤指定。在這個IoC容器初始化完畢後,spring容器以WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE為屬性Key,將其儲存到ServletContext中,便於獲取;

再次,contextLoaderListener監聽器初始化完畢後,開始初始化web.xml中配置的Servlet,這個servlet可以配置多個,以最常見的DispatcherServlet為例(Spring MVC),這個servlet實際上是一個標準的前端控制器,用以轉發、匹配、處理每個servlet請求。DispatcherServlet上下文在初始化的時候會建立自己的IoC上下文容器,用以持有spring mvc相關的bean,這個servlet自己持有的上下文預設實現類也是XmlWebApplicationContext。在建立DispatcherServlet自己的IoC上下文時,會利用WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE先從ServletContext中獲取之前的根上下文(即WebApplicationContext)作為自己上下文的parent上下文(即第2步中初始化的XmlWebApplicationContext作為自己的父容器)。有了這個parent上下文之後,再初始化自己持有的上下文(這個DispatcherServlet初始化自己上下文的工作在其initStrategies方法中可以看到,大概的工作就是初始化處理器對映、檢視解析等)。初始化完畢後,spring以與servlet的名字相關(此處不是簡單的以servlet名為Key,而是通過一些轉換)的屬性為屬性Key,也將其存到ServletContext中,以便後續使用。這樣每個servlet就持有自己的上下文,即擁有自己獨立的bean空間,同時各個servlet共享相同的bean,即根上下文定義的那些bean。

Bean載入過程

Spring的高明之處在於,它使用眾多介面描繪出了所有裝置的藍圖,構建好Spring的骨架,繼而通過繼承體系層層推演,不斷豐富,最終讓Spring成為有血有肉的完整的框架。所以檢視Spring框架的原始碼時,有兩條清晰可見的脈絡:

1)介面層描述了容器的重要元件及元件間的協作關係;

2)繼承體系逐步實現元件的各項功能。

介面層清晰地勾勒出Spring框架的高層功能,框架脈絡呼之欲出。有了介面層抽象的描述後,不但Spring自己可以提供具體的實現,任何第三方組織也可以提供不同實現, 可以說Spring完善的介面層使框架的擴充套件性得到了很好的保證。縱向繼承體系的逐步擴充套件,分步驟地實現框架的功能,這種實現方案保證了框架功能不會堆積在某些類的身上,造成過重的程式碼邏輯負載,框架的複雜度被完美地分解開了。

Spring元件按其所承擔的角色可以劃分為兩類:

1)物料元件:Resource、BeanDefinition、PropertyEditor以及最終的Bean等,它們是加工流程中被加工、被消費的元件,就像流水線上被加工的物料;

BeanDefinition:Spring通過BeanDefinition將配置檔案中的<bean>配置資訊轉換為容器的內部表示,並將這些BeanDefinition註冊到BeanDefinitionRegistry中。Spring容器的後續操作直接從BeanDefinitionRegistry中讀取配置資訊。

2)加工裝置元件:ResourceLoader、BeanDefinitionReader、BeanFactoryPostProcessor、InstantiationStrategy以及BeanWrapper等元件像是流水線上不同環節的加工裝置,對物料元件進行加工處理。

InstantiationStrategy:負責例項化Bean操作,相當於Java語言中new的功能,並不會參與Bean屬性的配置工作。屬性填充工作留待BeanWrapper完成

BeanWrapper:繼承了PropertyAccessor和PropertyEditorRegistry介面,BeanWrapperImpl內部封裝了兩類元件:(1)被封裝的目標Bean(2)一套用於設定Bean屬性的屬性編輯器;具有三重身份:(1)Bean包裹器(2)屬性訪問器 (3)屬性編輯器登錄檔。PropertyAccessor:定義了各種訪問Bean屬性的方法。PropertyEditorRegistry:屬性編輯器的登錄檔


上圖描述了Spring容器從載入配置檔案到創建出一個完整Bean的作業流程:

1、ResourceLoader從儲存介質中載入Spring配置資訊,並使用Resource表示這個配置檔案的資源;

2、BeanDefinitionReader讀取Resource所指向的配置檔案資源,然後解析配置檔案。配置檔案中每一個<bean>解析成一個BeanDefinition物件,並儲存到BeanDefinitionRegistry中;

3、容器掃描BeanDefinitionRegistry中的BeanDefinition,使用Java的反射機制自動識別出Bean工廠後處理後器(實現BeanFactoryPostProcessor介面)的Bean,然後呼叫這些Bean工廠後處理器對BeanDefinitionRegistry中的BeanDefinition進行加工處理。主要完成以下兩項工作:

1)對使用到佔位符的<bean>元素標籤進行解析,得到最終的配置值,這意味對一些半成品式的BeanDefinition物件進行加工處理並得到成品的BeanDefinition物件;

2)對BeanDefinitionRegistry中的BeanDefinition進行掃描,通過Java反射機制找出所有屬性編輯器的Bean(實現java.beans.PropertyEditor介面的Bean),並自動將它們註冊到Spring容器的屬性編輯器登錄檔中(PropertyEditorRegistry);

4.Spring容器從BeanDefinitionRegistry中取出加工後的BeanDefinition,並呼叫InstantiationStrategy著手進行Bean例項化的工作;

5.在例項化Bean時,Spring容器使用BeanWrapper對Bean進行封裝,BeanWrapper提供了很多以Java反射機制操作Bean的方法,它將結合該Bean的BeanDefinition以及容器中屬性編輯器,完成Bean屬性的設定工作;

6.利用容器中註冊的Bean後處理器(實現BeanPostProcessor介面的Bean)對已經完成屬性設定工作的Bean進行後續加工,直接裝配出一個準備就緒的Bean。

總結

Spring IOC容器主要有繼承體系底層的BeanFactory、高層的ApplicationContext和WebApplicationContext

Bean有自己的生命週期

容器啟動原理:Spring應用的IOC容器通過tomcat的Servlet或Listener監聽啟動載入;Spring MVC的容器由DispatchServlet作為入口載入;Spring容器是Spring MVC容器的父容器

容器載入Bean原理:

BeanDefinitionReader讀取Resource所指向的配置檔案資源,然後解析配置檔案。配置檔案中每一個<bean>解析成一個BeanDefinition物件,並儲存到BeanDefinitionRegistry中;

容器掃描BeanDefinitionRegistry中的BeanDefinition;呼叫InstantiationStrategy進行Bean例項化的工作;使用BeanWrapper完成Bean屬性的設定工作;

單例Bean快取池:Spring 在 DefaultSingletonBeanRegistry 類中提供了一個用於快取單例項 Bean 的快取器,它是一個用 HashMap 實現的快取器,單例項的 Bean 以 beanName 為鍵儲存在這個HashMap 中。
 

相關推薦

Spring IOC原理總結

Spring容器高層檢視 Spring 啟動時讀取應用程式提供的Bean配置資訊,並在Spring容器中生成一份相應的Bean配置登錄檔,然後根據這張登錄檔例項化Bean,裝配好Bean之間的依賴關係,為上層應用提供準備就緒的執行環境。 IOC容器介紹 Spring

Spring Ioc原理

service 新的 cto str gets ice instance brush users IOC實現原理:1 配置xml文件 2 dom4j根據xml文件得到id對應的classvalue 3反射創建類對象 4創建一個新的實例,返回實例 //IOC原理 // p

轉載 JAVA spring ioc原理 原文地址:http://blog.csdn.net/it_man/article/details/4402245

nbsp animal 很難 details 如何實現 拋出異常 感覺 註入 extend 最近,買了本Spring入門書:spring In Action 。大致瀏覽了下感覺還不錯。就是入門了點。Manning的書還是不錯的,我雖然不像哪些只看Manning書的人那樣專註

Spring IOC 學習總結

class文件 .net 全局 監聽 mave object pri 想想 forname 1 什麽是IOC、DI   IoC—Inversion of Control,即“控制反轉”,不是什麽技術,而是一種設計思想。在Java開發中,Ioc意味著將你設計好的對象交給容器控

Spring---IOC原理 SpringIOC原理[通俗解釋一下]

Spring的IOC原理(轉載) 在網上看到一篇文章,感覺寫得挺不錯的,轉載一下,本文轉載自:http://blog.csdn.net/m13666368773/article/details/7802126 Spring的IOC原理[通俗解釋

spring ioc原理 spring ioc原理(看完後大家可以自己寫一個spring

原 spring ioc原理(看完後大家可以自己寫一個spring) 2009年08月02日 20:33:00 超級谷歌 閱讀數:332663

最好理解的: spring ioc原理講解,強烈推薦!

IOC(DI):java程式中的每個業務邏輯至少需要兩個或以上的物件來協作完成。通常,每個物件在使用他的合作物件時,自己均要使用像new object() 這樣的語法來完成合作物件的申請工作。你會發現:物件間的耦合度高了。 而IOC的思想是:Spring容器來實現這些相互依

spring原理案例-基本專案搭建 03 建立工程執行測試 spring ioc原理例項示例

下面開始專案的搭建 使用 Java EE - Eclipse 新建一 Dynamic Web Project Target Runtime 選 Apache Tomcat 7.0(不要選 Apache Tomcat 6.0,7 以後才支援 Servlet 3.0)。 點選 Next > 按

Spring:原始碼解讀Spring IOC原理

1 //實現屬性依賴注入功能 2 private void setPropertyValue(PropertyTokenHolder tokens, PropertyValue pv) throws BeansException { 3 //PropertyTokenHo

spring ioc原理講解

IOC(DI):java程式中的每個業務邏輯至少需要兩個或以上的物件來協作完成。通常,每個物件在使用他的合作物件時,自己均要使用像new object() 這樣的語法來完成合作物件的申請工作。你會發現:物件間的耦合度高了。 而IOC的思想是:Spring容器來實現這些相互依賴物件的建立、協調工作

[轉]非常通俗易懂的Spring IOC原理

前言 看spring的書,總是不能很好的理解ioc,與反射注入,剛看了一篇文章,覺得解釋的很好,特地轉發。 文章的總結如下 IOC理論提出的觀點大體是這樣的:藉助於“第三方”實現具有依賴關係的物件之間的解耦 所謂依賴注入,就是由IOC容器

Spring IOC原理原始碼解析(@Autowired原理詳解 :標識屬性與方法)(二 )

原始碼推薦看這篇部落格的時候開啟Spring原始碼,一邊看原始碼,一邊看部落格上程式碼的關鍵處的註釋,這樣能更好的理解Spring IOC的流程及內部實現和使用方法。如果你對IOC的原理有些瞭解,則這些註釋能幫你更深入的理解其實現方式。 Spring容器在每個

spring ioc原理簡述

  那麼IoC是如何做的呢?有點像通過婚介找女朋友,在我和女朋友之間引入了一個第三者:婚姻介紹所。婚介管理了很多男男女女的資料,我可以向婚介提出一個列表,告訴它我想找個什麼樣的女朋友,比如長得像李嘉欣,身材像林熙雷,唱歌像周杰倫,速度像卡洛斯,技術像齊達內之類的,然後婚介就會按照我們的要求,提供一個mm,我們

Spring IOCSpring:原始碼解讀Spring IOC原理

一、什麼是Ioc/DI?     IoC 容器:最主要是完成了完成物件的建立和依賴的管理注入等等。 先從我們自己設計這樣一個視角來考慮: 所謂控制反轉,就是把原先我們程式碼裡面需要實現的物件建立、依賴的程式碼,反轉給容器來幫忙實現。那麼必然的我們需要建立一個容器

spring ioc原理(看完後大家可以自己寫一個spring

最近,買了本Spring入門書:spring In Action 。大致瀏覽了下感覺還不錯。就是入門了點。Manning的書還是不錯的,我雖然不像哪些只看Manning書的人那樣專注於Manning,但懷著崇敬的心情和激情通覽了一遍。又一次接受了IOC 、DI、AOP等S

Spring IOC原理之Java反射機制

1、反射概念以及為什麼要使用反射 我們考慮一個場景,如果我們在程式執行時,一個物件想要檢視自己所擁有的成員屬性,該如何操作? 那再考慮這樣另一個場景,如果我們想要在執行期獲得某個類Class的資訊如它

利用java反射機制模擬spring IOC原理的實現

在Java中反射和動態代理機制很強大,通過反射機制在執行時獲取資訊。用於實現IOC。 代理是Java基本的設計模式,提供向物件插入額外的或不同的操作。Java的動態代理能動態的建立代理物件,以及動態的呼叫代理方法。用於實現AOP。一、Java反射機制1、作用 (1)在執行時判斷任意一個物件所屬的類; (

spring 原始碼解讀Spring IOC原理

//建立Bean的例項物件 protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) { //檢查確認Bean是可例項化的 Cl

spring ioc原理(看完後大家可以自己寫一個spring)(摘)

摘自http://blog.csdn.net/it_man/archive/2009/08/02/4402245.aspx 最近,買了本Spring入門書:spring In Action 。大致瀏覽了下感覺還不錯。就是入門了點。Manning的書還是不錯的,我雖然不像哪些

Spring IOC原理原始碼解析(@Autowired原理詳解 :標識建構函式)(一 )

IOC,inversion of control 控制反轉,有時候也叫DI,dependency injection 依賴注入,是一種程式碼解耦的方式。 在一個類中定義一個屬性,正常情況下需要在此類中有對此屬性賦值的程式碼,如setter方法,或者在建構函式中