tft每日頭條

 > 生活

 > spring和ioc有什麼區别

spring和ioc有什麼區别

生活 更新时间:2024-11-30 09:46:08
IOC與DIIOC(控制反轉)概念

平時在開發程序的時候,每個對象在使用它的合作對象時都要自己主動去創建這個合作對象,需要時就主動創建出來,創建權在自己手裡,但是這種方式耦合度就很高;在使用Spring之後,将對象的創建權交給Spring容器來處理,所謂的控制就是将對象創建控制權交給了容器來創建,即容器控制了對象的創建,起初依賴對象的創建時對象主動創建,是正轉,而反轉就是将依賴對象的創建及注入給Spirng容器處理,對象隻是被動的接受依賴對象。

注入方式

在IOC中,為被注入對象提供被依賴對象有三種方式:構造方法注入,setter注入,接口注入

DI(依賴注入)概念

容器動态的将依賴關系注入到組件中,容器實例化對象的時候主動将它依賴的類注入給它

IOC的體系結構設計結構圖

spring和ioc有什麼區别(IOC概念及體系結構)1

下面對結構圖進行簡要分析,來理解這個接口設計圖

第一條接口設計主線是從BeanFactory到HierarchicalBeanFactory再到ConfigurableBeanFactory,BeanFactory定義了基本方法,例如getBean()等,HierarchicalBeanFactory增加了getParentBeanFactory接口功能,使BeanFactory具備了雙親IOC容器的管理功能;ConfigurableBeanFactory主要定義了一些對BeanFactory的配置功能,例如setParentBeanFactory()設置雙親IOC容器,通過addBeanPostProcessor()配置Bean後置管理器等;通過這些接口設計的疊加,定義了BeanFactory就是簡單IOC容器的基本功能

第二條設計主線是以ApplicationContext為核心的接口設計,從BeanFactory到ListableBeanFactory再到ApplicationContext,再到我們常用的WebApplicationContext或者ConfigurableApplicationContext。L在這個接口體系中ListableBeanFactory和HierarchicalBeanFactory兩個接口,連接BeanFactory接口定義和ApplicationContext應用上下文的接口定義。在ListableBeanFactory接口中,細化了許多BeanFactory接口功能,例如getBeanDefinitionNames()方法;對于ApplicationContext接口,它通過繼承MessageSource,ResourceLoader,ApplicationEventPublisher,在BeanFactory簡單IOC容器的基礎上添加了許多對高級容器的特性支持。

Resource體系

org.springframework.core.io.Resource,它的每一個實現類都代表了一周資源的訪問策略,例如

ClassPathResource、RLResource、FileSystemResource 等。

spring和ioc有什麼區别(IOC概念及體系結構)2

ResourceLoader 體系

有了資源之後,就要對資源進行加載,Spring就是利用ResourceLoader來進行統一的資源加載

spring和ioc有什麼區别(IOC概念及體系結構)3

BeanFactory體系

BeanFactory提供的是最基本的IOC容器的功能,并且提供了IoC容器所應該遵守的最基本的服務契約;BeanFactory隻是一個接口,而例如DefaultListableBeanFactory、XmlBeanFactory、ApplicationContet等都可以提供具體的實現。

spring和ioc有什麼區别(IOC概念及體系結構)4

BeanFactory基本方法
  • containsBean(String name)方法可以根據名字判斷是否還有此名字的Bean
  • isSingleton(String name)方法可以根據名字判斷是否是單例的Bean
  • isPrototype(String name)方法可以根據名字判斷是否是多例的Bean
  • isTypeMatch(String name, Class<?> typeToMatch)方法可以根據名字的Bean的Class類型是否是特定的Class類型
  • getType(String name)方法查詢指定名字的Bean的Class類型
  • getAliases(String name)查詢 該指定名字所有的Bean的别名
BeanFactory容器的設計原理

BeanFactory接口提供了使用IOC容器的基本接口規範,Spring還提供了符合這個IOC容器的一系列容器進行具體實現;通過XmlBeanFactory的實現為例進行說明:

spring和ioc有什麼區别(IOC概念及體系結構)5

從圖中可以看到類之間的聯系

spring和ioc有什麼區别(IOC概念及體系結構)6

從源碼可知,XmlBeanFactory繼承自DefaultListableBeanFactory,XmlBeanFactory新增了讀取XML文件的方法

spring和ioc有什麼區别(IOC概念及體系結構)7

XmlBeanFactory就是通過這個方法進行xml讀取,方法傳參需要Resource做為參數進行傳遞,對xmlBeanDefinitionReader對象初始化,以及使用這個對象來完成對loadBeanDefinitions的調用

BeanDefinition體系

用來描述Spring中的Bean對象。

spring和ioc有什麼區别(IOC概念及體系結構)8

BeanDefinitionReader體系

讀取Spring配置文件内容,并将其轉成IOC容器内部的數據結構:BeanDefinition

spring和ioc有什麼區别(IOC概念及體系結構)9

ApplicationContext體系

spring和ioc有什麼區别(IOC概念及體系結構)10

ApplicationContext除了能夠提供前面介紹的容器的基本功能,還為用戶提供了BeanFactory不具備的新特性

  • 支持不同的信息源。ApplicationContext擴展了MessageSource接口,這些信息源的擴展功能可以支持國際化的實現
  • 訪問資源:我們可以通過Resource來得到不同地方的Bean定義資源
  • 支持應用事件:繼承了接口ApplicationEventPublisher,從而在上下文中引入了事件機制
ApplicationContext容器的設計原理

我們通過FileSystemXmlApplicationContext的實現為例來說明ApplicationContext的設計原理

FileSystemXmlApplicationContext有兩個重要的功能

  • 一個功能是應用直接使用FileSystemXmlApplicationContext,對于實例化這個應用上下文支持,同時啟動IOC容器refresh()過程。這在FileSystemApplicationContext的代碼實現中可以看到:

spring和ioc有什麼區别(IOC概念及體系結構)11

這個refresh()過程會涉及IOC容器啟動的複雜操作,關于這個reresh()在IOC容器啟動時的具體表現,在後面再進行詳細分析

  • 另一個功能是與怎樣從文件系統中加載XML的Bean定義資源有關。

實現代碼如下:

spring和ioc有什麼區别(IOC概念及體系結構)12

調用這個方法,可以得到FileSystemResource的資源定位

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved