一、什么是Spring IOC?
所謂IOC就是由spring來負責對象或資源的生命周期和對象之間的關系的,也就是對對象或資源的創建及管理。
二、IOC的四個要點是什么?
一、誰控制了誰?
????????????——傳統模式中當一個對象A 需要另外一個對象B或資源C支持時需要自己主動去new B或加載C 。也就是主動控制對象或資源的獲取。但用了spring 后就會發現 這一切都可以不用自己親自“動手”,IOC就可以幫我們搞定了。所以是Spring IOC 控制了對象和資源
二、控制了什么?
? ? ? ? ? ? ——控制了對象和資源
三、為什么是反轉?
? ? ? ? ? ? ——由原來的主動獲取對象和資源的“正轉方式”,變成了現在完全有IOC幫著分配對象或資源的方式,所以叫反轉。
四、哪些方面反轉了?
? ? ? ? ? ? ——所依賴的對象和資源被反轉。
三、IOC有哪幾種方式提供對象資源?
一、構造器方式注入
? ? ? ? ——構造方法都知道有參和無參兩種,所以我認為可以分為“先天”和“后天”兩種。先天——則是這個對象很牛掰 “出生”就自帶對象;后天——則是需要我們手動注入依賴參數對象(這種我們可以稱之為“指腹為婚”)。
二、setter方法注入
? ? ? ? ——這種方式比較自由是有被注入的對象提供條件生產所需的對象。比如:他需要一個老婆 (set老婆),這個老婆對象是他“定制”的 比如:1、林志玲一樣的聲音;2、高圓圓一樣的容貌;3、劉詩詩一樣的溫柔;4、趙麗穎樣的可愛;5、迪麗熱巴一樣的身高等等。(現實中能娶這樣女人的男人都是家里有礦啊。)
三、接口方式注入
? ? ? ? ——這一種就類似A1類實現A接口一樣。比較霸道,可能要被逼接受一些自己不需要的方法。
四、IOC核心接口類
借鑒該大神的一張圖:https://singleant.iteye.com/blog/1177358
這張圖基本上詮釋了Spring IOC容器的核心接口。當然這張圖是以ClassPathXmlApplicationContext 切入點觀瀾全局的。
另外還有三個點:
XmlWebApplicationContext、GenericXmlApplicationContext、FileSystemXmlApplicationContext 都能回溯到ApplicationContext 核心接口類中
五、IOC 五大核心體系
(1)Resource 體系:
? ? ? ? ? ? ——resource 是spring 對資源的抽象?,他下面的每一個實現類都代表著一種資源訪問的策略:
?????????????UrlResource
????????????FileUrlResource
????????????FileSystemResource
????????????ClassPathResource
????????????ByteArrayResource
???????????? InputStreamResource 以上都是繼承AbstractResource而來,還有一些是直接繼承Resource
上面的只是對資源的抽象封裝,如果要使用那就需要對資源的加載。所以下圖是ResourceLoader ——資源加載器。Spring正是通過下圖結構對Resource資源體系的加載。
(2)BeanFactory體系
? ? ? ? ——BeanFactory體系是整個Spring對Bean的創建和管理的一個工廠。它其中維護者一個重要的參數beanDefinitionMap<String,BeanDefinition>。
????????????????BeanFacoty 有三個直接子類?ListableBeanFactory、HierarchicalBeanFactory?和?AutowireCapableBeanFactory。DefaultListableBeanFactory?為最終默認實現,它實現了所有接口
(3)BeanDefinition體系
? ? ? ? ? ?——是對Spring中的對象的描述或者說封裝
(4)BeanDefinitionReader體系
? ? ? ? ——是對spring配置文件的獲取和解析,并將配置文件的中的內容轉換成IOC容器格式的對象:BeanDefinition 就是上面的。
(5)ApplicationContext體系也是整個Spring IOC最核心的
? ? ? ? ——它是整個spring的容器,他繼承了BeanFactory所有接口,而且自己也擴展了額外的接口。所以可以說是BeanFactory的升級版。
那到底比BeanFactory高級在哪里?如下:
1、繼承 MessageSource,提供國際化的標準訪問策略。
2、繼承 ApplicationEventPublisher ,提供強大的事件機制。
3、擴展 ResourceLoader,可以用來加載多個 Resource,可以靈活訪問不同的資源。
4、對 Web 應用的支持
再來重新看一遍ApplicationContext整個體系圖