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