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