c# ioc 单例模式_Spring-IOC
生活随笔
收集整理的這篇文章主要介紹了
c# ioc 单例模式_Spring-IOC
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Spring IoC概念:
IoC 概念應用控制反轉,對象在創建的時候,由一個調控系統內所有對象的外界實體,將其所依賴的對象的引用,傳遞給它。也可以說,依賴注入到對象中。所以,控制反轉是,關于一個對象如何獲取他所依賴的對象的引用,這個責任的反轉。
控制反轉(Inversion of Controll)是一個重要的面向對象編程的法則,來削弱計算機程序的耦合問題,也是輕量級 Spring 框架的核心。
控制反轉一般分為兩種類型,依賴注入(Dependency Injection,DI)和依賴查找(Dependency Lookup),依賴注入應用廣泛。
深入分析
依賴于誰?應用程序依賴于 IoC 容器
為什么要依賴?應用程序需要 IoC 容器來提供對象需要的外部資源
誰注入誰?IoC容器注入應用程序某個對象,應用程序依賴的對象
注入了社么?注入某個對象所需要的外部資源(包括對象、資源、常量對象)
與new對象的區別
正轉與反轉,傳統應用程序是由我們將自己在對象中主動控制去直接獲取依賴對象,也就是正轉;而反轉則是由容器來幫助創建及注入依賴對象。
IoC優缺點
優點:實現組件之間的解耦,提供程序的靈活性和可維護性
缺點:對象生成因為是使用反射編程,在效率上有損耗
IoC 容器
概念:在每個框架中都有一個容器的概念,所謂的容器就是將常用的服務封裝起來,然后,用戶只需要遵循一定的規則,就可以達到統一、靈活、安全、方便、快速的目的
具有依賴注入功能的容器,負責實例化、定位、配置應用程序中的對象及建立這些對象間的依賴
Bean的概念:
由IoC容器管理的那些組成應用程序的對象就叫Bean
Bean就是由Spring容器初始化、裝配及管理的對象,除此之外,Bean就與應用程序中的其他對象沒什么區別了
元數據 BeanDefinition
確定如何實例化Bean、管理Bean之間的依賴關系及管理Bean,就需要配置元數據,在Spring中由BeanDefintion代表
如何工作(以XML配置方式解釋)
準備配置文件:配置文件中聲明 Bean 定義也就是 Bean 配置元數據。
由 IoC 容器進行解析元數據:IoC 容器的 Bean Reader 讀取并解析配置文件,根據定義生成 BeanDefintion 配置元數據對象,IoC 容器根據 BeanDefintion 進行實例化、配置及組裝 Bean。
實例化 IoC 容器:由客戶端實例化容器,獲取需要的 Bean。
Spring IoC 初始化
三種注入方式
在Spring框架中,依賴注入(DI)的設計模式是用來定義對象彼此間的依賴。使用xml配置bean的情況下,它主要有兩種類型:
- Setter 方法注入
- 構造器注入
- 注解 @autowired
當然,有了注解之后,使用注解的方式更加方便快捷。即自動裝配功能實現屬性自動注入(@autowire)。
原理解析:
當運行 ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");構造方法 ClassPathXmlApplicationContext(String configLocation), 調用了 this(new String[] {configLocation}, true, null); 該構造方法具體代碼:【ClassPathXmlApplicationContext構造方法】:/** * 在 parent 下創建 ClassPathXmlApplicationContext, * 從 XML 中讀取素有 Bean 定義。 * @param configLocations 配置文件路徑如 c:simpleContext.xml * @param refresh 是否需要自動刷新 context,refrest--> 重新加載 * 加載所有的 bean 定義,創建所有單例。 * refresh 為 true 的時候,根據 context 來手工刷新 * @param parent the parent context * @throws BeansException if context creation failed * @see #refresh() */ public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent) throws BeansException{// 初始化XmlApplicationContextsuper(parent);// 轉換配置文件的路徑setConfigLocations(configLocations);if(refresh) {// 重新刷新所有的 context,這一篇的重點refresh();} }
【refresh方法】:
/** * 加載或刷新持久的配置,可能是xml文件,properties文件,或者關系型數據庫的概要。 * 作為一啟動方法,如果初始化失敗將會銷毀已經創建好的單例,避免重復加載配置文件。 * 換句話說,在執行這個方法之后,要不全部加載單例,要不都不加載。 public void refresh() throws BeansException, IllegalStateException {synchronized(this.startupShutdownMonitor) {// 初始化配置準備刷新,驗證環境中的一些必選參數prepareRefresh();// 告訴繼承銷毀內部的 factory創建新的 factory 實例// 初始化 Bean 實例ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();// 初始化 beanFactory 的基本信息,包括 classLoader、environment、忽略的注解等。prepareBeanFactory(beanFactory);try {// beanFactory 內部的 postProces,可以理解為 context 中的 PostProcess 的補充beanFactory.postProcessBeanFactory(beanFactory)p;// 執行 BeanFactoryPostProcessor(在beanFactory)初始化過程中,bean 初始化之前,修改BeanFactory 參數// BeanDefinitionRegistryPostProcessor 其實也是繼承自 BeanFactoryPostProcessor,// 多個對 BeanDefinitionRegistry 的支持 invokeBeanFactoryPostProcessors(beanFactory)// 執行 postProcess,那 BeanPoseProcessor 是什么呢,是為了在 bean 加載過程中修改 bean 的內容,// 使用Before、After分別對應初始化前和初始化后registerBeanPostProcessors(beanFactory);// 初始化 MessageSource,主要用于 I18N 本地化的內容initMessageSource();// 初始化事件廣播 ApplicationEventMulticaster,使用觀察者模式,對注冊的 ApplicationEvent 時間進行捕捉initApplicationEventMulticaster();// 初始化特殊的 bean 方法onRefresh();// 將所有 ApplicationEventListener 注冊到 ApplicationEventMulticaster 中registerListeners();// 初始化所有部位 lazy-init 的bean,singleton 實例finishBeanFactoryInitialization(beanFactory);// 初始化 lifeCycle 的bean啟動(例如 quartz 的定時器),如果開啟 JMX 則將 ApplicationContext 注冊到上面finishRefresh();} catch(BeansException ex) {// 銷毀已經創建單例resources.destroyBeans();// 將 context 的狀態轉換為無效,標示初始化失敗flag.cancelRefresh(ex);}} }轉自: java思維導圖
總結
以上是生活随笔為你收集整理的c# ioc 单例模式_Spring-IOC的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: batch spring 重复执行_Sp
- 下一篇: 找出一批正整数中的最大偶数_正整数的性质