摘要:學習總結學習整理的一些筆記,很簡單。大部分認為和只是不同的叫法而已。依賴注入的兩種方式和注解使用注釋驅動的功能源碼剖析
Spring IoC學習總結
學習spring Ioc整理的一些筆記,很簡單。分享給大家。
IoC 基本概念
在這之前,我們先記住一句話。好萊塢原則:Don"t call us, we will call you.
其實這句話很恰當地形容了“反轉”的意味;
Ioc, Inversion of Control,控制反轉,它還有一個別名叫“依賴注入”(DI Dependency Injection)。IoC不是什么技術,而是一種設計思想。在Java開發中,Ioc意味著將你設計好的對象交給容器控制,而不是傳統的在你的對象內部直接控制。如何理解好Ioc呢?理解好Ioc的關鍵是要明確“誰控制誰,控制什么,為何是反轉(有反轉就應該有正轉了),哪些方面反轉了”
誰控制誰,控制什么:傳統Java SE程序設計,我們直接在對象內部通過new進行創建對象,是程序主動去創建依賴對象;而IoC是有專門一個容器來創建這些對象,即由Ioc容器來控制對 象的創建;誰控制誰?當然是IoC 容器控制了對象;控制什么?那就是主要控制了外部資源獲取(不只是對象包括比如文件等)。
為何是反轉,哪些方面反轉了:有反轉就有正轉,傳統應用程序是由我們自己在對象中主動控制去直接獲取依賴對象,也就是正轉;而反轉則是由容器來幫忙創建及注入依賴對象;為何是反轉?因為由容器幫我們查找及注入依賴對象,對象只是被動的接受依賴對象,所以是反轉;哪些方面反轉了?依賴對象的獲取被反轉了。
還有一個概念:DI 依賴注入。大部分認為IoC和DI只是不同的叫法而已。
理解DI的關鍵是:“誰依賴誰,為什么需要依賴,誰注入誰,注入了什么”
誰依賴于誰:當然是應用程序依賴于IoC容器;
為什么需要依賴:應用程序需要IoC容器來提供對象需要的外部資源;
誰注入誰:很明顯是IoC容器注入應用程序某個對象,應用程序依賴的對象;
注入了什么:就是注入某個對象所需要的外部資源(包括對象、資源、常量數據)。
Spring IoC
我理解的spring IoC分為兩部分:Bean實例的創建和依賴注入;
Spring IoC容器如何實例化Bean呢?傳統應用程序可以通過new和反射方式進行實例化Bean。而Spring IoC容器則需要根據Bean定義里的配置元數據使用反射機制來創建Bean。(大家可以了解一下Java的反射機制,這是Spring Ioc實現Bean實例化的核心機制)在Spring IoC容器中根據Bean定義創建Bean主要有以下幾種方式:
使用構造器實例化Bean 有參/無參
使用靜態工廠實例化Bean
使用實例工廠實例化Bean
另外,靜態工廠和實例工廠方法還有對應的靜態工廠類和實例工廠類
/** * 靜態工廠類 * **/ public class DemoStaticFactory { //工廠方法 public static HelloApi newInstance(String message) { //返回需要的Bean實例 return new Demo(message); } } /** * 實例工廠類 * **/ package com.java.spring; public class DemoInstanceFactory { public HelloApi newInstance(String message) { return new Demo(message); } }
這一塊補充一個細節。Spring什么時候實例化bean,首先要分2種情況:
第一:如果你使用BeanFactory作為Spring Bean的工廠類,則所有的bean都是在第一次使用該Bean的時候實例化
第二:如果你使用ApplicationContext作為Spring Bean的工廠類,則又分為以下幾種情況:
(1):如果bean的scope是singleton的,并且lazy-init為false(默認是false,所以可以不用設置),則ApplicationContext啟動的時候就實例化該Bean,并且將實例化的Bean放在一個map結構的緩存中,下次再使用該Bean的時候,直接從這個緩存中取 (2):如果bean的scope是singleton的,并且lazy-init為true,則該Bean的實例化是在第一次使用該Bean的時候進行實例化 (3):如果bean的scope是prototype的,則該Bean的實例化是在第一次使用該Bean的時候進行實例化
通常使用ApplicationContext作為容器的。
使用@Autowire注解注入的時機則是容器剛啟動的時候就開始注入;注入之前要先初始化bean;
ApplicationContext 的初始化和BeanFactory 有一個重大的區別:BeanFactory在初始化容器時,并未實例化Bean,直到第一次訪問某個Bean 時才實例目標Bean;而ApplicationContext 則在初始化應用上下文時就實例化所有單實例的Bean。
了解Bean的實例化后,接下來就是Bean實例之間的關系,也就是依賴注入;
Spring IoC容器的依賴有兩層含義:Bean依賴容器和容器注入Bean的依賴資源:
Bean依賴容器:也就是說Bean要依賴于容器,這里的依賴是指容器負責創建Bean并管理Bean的生命周期,正是由于由容器來控制創建Bean并注入依賴,也就是控制權被反轉了,這也正是IoC名字的由來,此處的有依賴是指Bean和容器之間的依賴關系。
容器注入Bean的依賴資源:容器負責注入Bean的依賴資源,依賴資源可以是Bean、外部文件、常量數據等,在Java中都反映為對象,并且由容器負責組裝Bean之間的依賴關系,此處的依賴是指Bean之間的依賴關系,可以認為是傳統類與類之間的“關聯”、“聚合”、“組合”關系。
Spring IoC容器注入依賴資源主要有以下兩種基本實現方式:
構造器注入:就是容器實例化Bean時注入那些依賴,通過在在Bean定義中指定構造器參數進行注入依賴,包括實例工廠方法參數注入依賴,但靜態工廠方法參數不允許注入依賴;
setter注入:通過setter方法進行注入依賴;
一、構造器注入:
1)常量值
常量
2)引用
二、setter注入:
1)常量值
常量 property>
2)引用
property>
3)數組:
1 2 3
4)列表:
1 2 3
5)集合:
1 2 3
6)字典
7)Properties
另外,基于注解驅動的Spring Ioc的原理以及Spring IoC源碼剖析相關我在在網上找到一些文章,大家也可以看一下。
Spring依賴注入的兩種方式xml和注解
使用注釋驅動的Ioc功能
Spring IoC源碼剖析
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67521.html
摘要:入門篇學習總結時間年月日星期三說明本文部分內容均來自慕課網。主要的功能是日志記錄,性能統計,安全控制,事務處理,異常處理等等。 《Spring入門篇》學習總結 時間:2017年1月18日星期三說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學示例源碼:https://github.com/zccodere/s...個人學習源碼:https://git...
摘要:使用的好處知乎的回答不用自己組裝,拿來就用。統一配置,便于修改。 前言 只有光頭才能變強 回顧前面: 給女朋友講解什么是代理模式 包裝模式就是這么簡單啦 單例模式你會幾種寫法? 工廠模式理解了沒有? 在刷Spring書籍的時候花了點時間去學習了單例模式和工廠模式,總的來說還是非常值得的! 本來想的是刷完《Spring 實戰 (第4版)》和《精通Spring4.x 企業應用開發實戰》...
摘要:依賴注入是向某個類或方法注入一個值,其中所用到的原理就是控制反轉。但發現更多時間是在調和的源碼。里面就是從中取出這個,完成控制反轉的??刂品崔D的優點最后來以我個人觀點談談控制反轉的優點吧??刂品崔D為了降低項目耦合,提高延伸性。 本章開始來學習下Spring的源碼,看看Spring框架最核心、最常用的功能是怎么實現的。網上介紹Spring,說源碼的文章,大多數都是生搬硬推,都是直接看來的...
摘要:本文是容器源碼分析系列文章的第一篇文章,將會著重介紹的一些使用方法和特性,為后續的源碼分析文章做鋪墊。我們可以通過這兩個別名獲取到這個實例,比如下面的測試代碼測試結果如下本小節,我們來了解一下這個特性。 1. 簡介 Spring 是一個輕量級的企業級應用開發框架,于 2004 年由 Rod Johnson 發布了 1.0 版本。經過十幾年的迭代,現在的 Spring 框架已經非常成熟了...
摘要:會一直完善下去,歡迎建議和指導,同時也歡迎中用到了那些設計模式中用到了那些設計模式這兩個問題,在面試中比較常見。工廠設計模式使用工廠模式可以通過或創建對象。 我自己總結的Java學習的系統知識點以及面試問題,已經開源,目前已經 41k+ Star。會一直完善下去,歡迎建議和指導,同時也歡迎Star: https://github.com/Snailclimb... JDK 中用到了那...
閱讀 1122·2021-11-25 09:43
閱讀 1644·2021-09-13 10:25
閱讀 2602·2021-09-09 11:38
閱讀 3409·2021-09-07 10:14
閱讀 1719·2019-08-30 15:52
閱讀 644·2019-08-30 15:44
閱讀 3578·2019-08-29 13:23
閱讀 1978·2019-08-26 13:33