摘要:使用的好處知乎的回答不用自己組裝,拿來就用。統(tǒng)一配置,便于修改。
前言
只有光頭才能變強(qiáng)
回顧前面:
給女朋友講解什么是代理模式
包裝模式就是這么簡單啦
單例模式你會(huì)幾種寫法?
工廠模式理解了沒有?
在刷Spring書籍的時(shí)候花了點(diǎn)時(shí)間去學(xué)習(xí)了單例模式和工廠模式,總的來說還是非常值得的!
本來想的是刷完《Spring 實(shí)戰(zhàn) (第4版)》和《精通Spring4.x 企業(yè)應(yīng)用開發(fā)實(shí)戰(zhàn)》的IOC章節(jié)后來重新編寫一篇IOC的文章的,看了一下之前已經(jīng)寫過的入門系列Spring入門這一篇就夠了和Spring【依賴注入】就是這么簡單。最主要的知識點(diǎn)都已經(jīng)講過了,所以感覺就沒必要重新來編寫這些知識點(diǎn)了...
我個(gè)人又不喜歡將寫過的東西復(fù)制到新的文章中,所以建議大家可以先去閱讀上面兩篇文章再來看這篇(工廠模式那篇如果沒有看過的同學(xué)也有必要去看看)~~
為了這篇文章知識點(diǎn)的完整性,重要的知識點(diǎn)(IOC概念理解,創(chuàng)建Bean、注入的三種方式等)還是會(huì)出現(xiàn),但是不會(huì)將上面兩篇博文的代碼摘抄過來了。
這篇文章主要是補(bǔ)充和強(qiáng)化一些比較重要的知識點(diǎn),并會(huì)把上面的兩本書關(guān)于IOC的知識點(diǎn)整理出來并畫成一個(gè)思維導(dǎo)圖來全面了解Spring IOC的知識點(diǎn)!
那么接下來就開始吧,如果有錯(cuò)的地方希望能多多包涵,并不吝在評論區(qū)指正!
一、Spring IOC全面認(rèn)知結(jié)合《Spring 實(shí)戰(zhàn) (第4版)》和《精通Spring4.x 企業(yè)應(yīng)用開發(fā)實(shí)戰(zhàn)》兩本書的IOC章節(jié)將其知識點(diǎn)整理起來~
1.1IOC和DI概述在《精通Spring4.x 企業(yè)應(yīng)用開發(fā)實(shí)戰(zhàn)》中對IOC的定義是這樣的:
IoC(Inversion of Control)控制反轉(zhuǎn),包含了兩個(gè)方面:一、控制。二、反轉(zhuǎn)
我們可以簡單認(rèn)為:
控制指的是:當(dāng)前對象對內(nèi)部成員的控制權(quán)。
反轉(zhuǎn)指的是:這種控制權(quán)不由當(dāng)前對象管理了,由其他(類,第三方容器)來管理。
IOC不夠開門見山,于是Martin Fowler提出了DI(dependency injection)來替代IoC,即讓調(diào)用類對某一接口實(shí)現(xiàn)類的依賴關(guān)系由第三方(容器或協(xié)作類)注入,以移除調(diào)用類對某一接口實(shí)現(xiàn)類的依賴。
在《Spring 實(shí)戰(zhàn) (第4版)》中并沒有提及到IOC,而是直接來說DI的:
通過DI,對象的依賴關(guān)系將由系統(tǒng)中負(fù)責(zé)協(xié)調(diào)各對象的第三方組件在創(chuàng)建對象的時(shí)候進(jìn)行設(shè)定,對象無需自行創(chuàng)建或管理它們的依賴關(guān)系,依賴關(guān)系將被自動(dòng)注入到需要它們的對象當(dāng)中去
從書上我們也可以發(fā)現(xiàn):IoC和DI的定義(區(qū)別)并不是如此容易就可以說得清楚的了。這里我就簡單摘抄一下:
IoC(思想,設(shè)計(jì)模式)主要的實(shí)現(xiàn)方式有兩種:依賴查找,依賴注入。
依賴注入是一種更可取的方式(實(shí)現(xiàn)的方式)
對我們而言,其實(shí)也沒必要分得那么清,混合一談也不影響我們的理解...
再通過昨天寫過的工廠模式理解了沒有?,我們現(xiàn)在就可以很清楚的發(fā)現(xiàn),其實(shí)所謂的IOC容器就是一個(gè)大工廠【第三方容器】(Spring實(shí)現(xiàn)的功能很強(qiáng)大!比我們自己手寫的工廠要好很多)。
使用IOC的好處(知乎@Intopass的回答):
不用自己組裝,拿來就用。
享受單例的好處,效率高,不浪費(fèi)空間。
便于單元測試,方便切換mock組件。
便于進(jìn)行AOP操作,對于使用者是透明的。
統(tǒng)一配置,便于修改。
參考資料:
https://www.zhihu.com/question/23277575--Spring IoC有什么好處呢?
1.2IOC容器的原理從上面就已經(jīng)說了:IOC容器其實(shí)就是一個(gè)大工廠,它用來管理我們所有的對象以及依賴關(guān)系。
原理就是通過Java的反射技術(shù)來實(shí)現(xiàn)的!通過反射我們可以獲取類的所有信息(成員變量、類名等等等)!
再通過配置文件(xml)或者注解來描述類與類之間的關(guān)系
我們就可以通過這些配置信息和反射技術(shù)來構(gòu)建出對應(yīng)的對象和依賴關(guān)系了!
上面描述的技術(shù)只要學(xué)過點(diǎn)Java的都能說出來,這一下子可能就會(huì)被面試官問倒了,我們簡單來看看實(shí)際Spring IOC容器是怎么實(shí)現(xiàn)對象的創(chuàng)建和依賴的:
根據(jù)Bean配置信息在容器內(nèi)部創(chuàng)建Bean定義注冊表
根據(jù)注冊表加載、實(shí)例化bean、建立Bean與Bean之間的依賴關(guān)系
將這些準(zhǔn)備就緒的Bean放到Map緩存池中,等待應(yīng)用程序調(diào)用
Spring容器(Bean工廠)可簡單分成兩種:
BeanFactory
這是最基礎(chǔ)、面向Spring的
ApplicationContext
這是在BeanFactory基礎(chǔ)之上,面向使用Spring框架的開發(fā)者。提供了一系列的功能!
幾乎所有的應(yīng)用場合都是使用ApplicationContext!
BeanFactory的繼承體系:
ApplicationContext的繼承體系:
其中在ApplicationContext子類中又有一個(gè)比較重要的:WebApplicationContext
專門為Web應(yīng)用準(zhǔn)備的
Web應(yīng)用與Spring融合:
我們看看BeanFactory的生命周期:
接下來我們再看看ApplicationContext的生命周期:
初始化的過程都是比較長,我們可以分類來對其進(jìn)行解析:
Bean自身的方法:如調(diào)用 Bean 構(gòu)造函數(shù)實(shí)例化 Bean,調(diào)用 Setter 設(shè)置 Bean 的屬性值以及通過
Bean級生命周期接口方法:如 BeanNameAware、 BeanFactoryAware、 InitializingBean 和 DisposableBean,這些接口方法由 Bean 類直接實(shí)現(xiàn);
容器級生命周期接口方法:在上圖中帶“★” 的步驟是由 InstantiationAwareBean PostProcessor 和 BeanPostProcessor 這兩個(gè)接口實(shí)現(xiàn),一般稱它們的實(shí)現(xiàn)類為“ 后處理器” 。 后處理器接口一般不由 Bean 本身實(shí)現(xiàn),它們獨(dú)立于 Bean,實(shí)現(xiàn)類以容器附加裝置的形式注冊到Spring容器中并通過接口反射為Spring容器預(yù)先識別。當(dāng)Spring 容器創(chuàng)建任何 Bean 的時(shí)候,這些后處理器都會(huì)發(fā)生作用,所以這些后處理器的影響是全局性的。當(dāng)然,用戶可以通過合理地編寫后處理器,讓其僅對感興趣Bean 進(jìn)行加工處理
ApplicationContext和BeanFactory不同之處在于:
ApplicationContext會(huì)利用Java反射機(jī)制自動(dòng)識別出配置文件中定義的BeanPostProcessor、 InstantiationAwareBeanPostProcesso 和BeanFactoryPostProcessor后置器,并自動(dòng)將它們注冊到應(yīng)用上下文中。而BeanFactory需要在代碼中通過手工調(diào)用addBeanPostProcessor()方法進(jìn)行注冊
ApplicationContext在初始化應(yīng)用上下文的時(shí)候就實(shí)例化所有單實(shí)例的Bean。而BeanFactory在初始化容器的時(shí)候并未實(shí)例化Bean,直到第一次訪問某個(gè)Bean時(shí)才實(shí)例化目標(biāo)Bean。
有了上面的知識點(diǎn)了,我們再來詳細(xì)地看看Bean的初始化過程:
簡要總結(jié):
BeanDefinitionReader讀取Resource所指向的配置文件資源,然后解析配置文件。配置文件中每一個(gè)
容器掃描BeanDefinitionRegistry中的BeanDefinition;調(diào)用InstantiationStrategy進(jìn)行Bean實(shí)例化的工作;使用BeanWrapper完成Bean屬性的設(shè)置工作;
單例Bean緩存池:Spring 在DefaultSingletonBeanRegistry類中提供了一個(gè)用于緩存單實(shí)例 Bean 的緩存器,它是一個(gè)用HashMap實(shí)現(xiàn)的緩存器,單實(shí)例的Bean以beanName為鍵保存在這個(gè)HashMap中。
1.3IOC容器裝配Bean 1.3.1裝配Bean方式Spring4.x開始IOC容器裝配Bean有4種方式:
XML配置
注解
JavaConfig
基于Groovy DSL配置(這種很少見)
總的來說:我們以XML配置+注解來裝配Bean得多,其中注解這種方式占大部分!
1.3.2依賴注入方式依賴注入的方式有3種方式:
屬性注入-->通過setter()方法注入
構(gòu)造函數(shù)注入
工廠方法注入
總的來說使用屬性注入是比較靈活和方便的,這是大多數(shù)人的選擇!
1.3.3對象之間關(guān)系依賴-->挺少用的(使用depends-on就是依賴關(guān)系了-->前置依賴【依賴的Bean需要初始化之后,當(dāng)前Bean才會(huì)初始化】)
繼承-->可能會(huì)用到(指定abstract和parent來實(shí)現(xiàn)繼承關(guān)系)
引用-->最常見(使用ref就是引用關(guān)系了)
1.3.4Bean的作用域Bean的作用域:
單例Singleton
多例prototype
與Web應(yīng)用環(huán)境相關(guān)的Bean作用域
reqeust
session
使用到了Web應(yīng)用環(huán)境相關(guān)的Bean作用域的話,是需要我們手動(dòng)配置代理的~
原因也很簡單:因?yàn)槲覀兡J(rèn)的Bean是單例的,為了適配Web應(yīng)用環(huán)境相關(guān)的Bean作用域--->每個(gè)request都需要一個(gè)對象,此時(shí)我們返回一個(gè)代理對象出去就可以完成我們的需求了!
將Bean配置單例的時(shí)候還有一個(gè)問題:
如果我們的Bean配置的是單例,而Bean對象里邊的成員對象我們希望是多例的話。那怎么辦呢??
默認(rèn)的情況下我們的Bean單例,返回的成員對象也默認(rèn)是單例的(因?yàn)閷ο缶椭挥心敲匆粋€(gè))!
此時(shí)我們需要用到了lookup方法注入,使用也很簡單,看看例子就明白了:
1.3.6處理自動(dòng)裝配的歧義性昨天在刷書的時(shí)候剛好看到了有人在知乎邀請我回答這個(gè)問題:
結(jié)合兩本書的知識點(diǎn),可以歸納成兩種解決方案:
使用@Primary注解設(shè)置為首選的注入Bean
使用@Qualifier注解設(shè)置特定名稱的Bean來限定注入!
也可以使用自定義的注解來標(biāo)識
1.3.7引用屬性文件以及Bean屬性之前在寫配置文件的時(shí)候都是直接將我們的數(shù)據(jù)庫配置信息在里面寫死的了:
其實(shí)我們有更優(yōu)雅的做法:將這些配置信息寫到配置文件上(因?yàn)檫@些配置信息很可能是會(huì)變的,而且有可能被多個(gè)配置文件引用).
如此一來,我們改的時(shí)候就十分方便了。
引用配置文件的數(shù)據(jù)使用的是${}
除了引用配置文件上的數(shù)據(jù),我們還可以引用Bean的屬性:
引用Bean的屬性使用的是#{}
在這種技術(shù)在《Spring 實(shí)戰(zhàn) 第四版》稱之為Spring EL,跟我們之前學(xué)過的EL表達(dá)式是類似的。主要的功能就是上面的那種,想要更深入了解可參考下面的鏈接:
http://www.cnblogs.com/leiOOlei/p/3543222.html
1.3.8組合配置文件xml文件之間組合:
xml和javaconfig互相組合的方式:
public static void main(String[] args) { //1.通過構(gòu)造函數(shù)加載配置類 ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConf.class); //2.通過編碼方式注冊配置類 AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.register(DaoConfig.class); ctx.register(ServiceConfig.class); ctx.refresh(); //3.通過XML組裝@Configuration配置類所提供的配置信息 ApplicationContext ctx = new ClassPathXmlApplicationContext("com/smart/conf/beans2.xml"); //4.通過@Configuration組裝XML配置所提供的配置信息 ApplicationContext ctx = new AnnotationConfigApplicationContext(LogonAppConfig.class); //5.@Configuration的配置類相互引用 ApplicationContext ctx = new AnnotationConfigApplicationContext(DaoConfig.class,ServiceConfig.class); LogonService logonService = ctx.getBean(LogonService.class); System.out.println((logonService.getLogDao() !=null)); logonService.printHelllo(); }
第一種的例子:
第二種的例子:
第三種的例子:
第四種的例子:
第五種的例子:
代碼由上可見
1.3.9裝配Bean總結(jié)總的來說,Spring IOC容器就是在創(chuàng)建Bean的時(shí)候有很多的方式給了我們實(shí)現(xiàn),其中也包括了很多關(guān)于Bean的配置~
對于Bean相關(guān)的注入教程代碼和簡化配置(p和c名稱空間)我就不一一說明啦,你們?nèi)タ碨pring入門這一篇就夠了和Spring【依賴注入】就是這么簡單就行了。
總的對比圖:
分別的應(yīng)用場景:
至于一些小的知識點(diǎn):
方法替換
使用某個(gè)Bean的方法替換成另一個(gè)Bean的方法
屬性編輯器
Spring可以對基本類型做轉(zhuǎn)換就歸結(jié)于屬性編輯器的功勞!
國際化
使用不同語言(英語、中文)的操作系統(tǒng)去顯式不同的語言
profile與條件化的Bean
滿足了某個(gè)條件才初始化Bean,這可以方便切換生產(chǎn)環(huán)境和開發(fā)環(huán)境~
容器事件
類似于我們的Servlet的監(jiān)聽器,只不過它是在Spring中實(shí)現(xiàn)了~
上面這些小知識點(diǎn)比較少情況會(huì)用到,這也不去講解啦。知道有這么一回事,到時(shí)候查查就會(huì)用啦~~~
二、Spring IOC相關(guān)面試題將SpringIOC相關(guān)知識點(diǎn)整理了一遍,要想知道哪些知識點(diǎn)是比較重要的。很簡單,我們?nèi)フ艺蚁嚓P(guān)的面試題就知道了,如果該面試題是常見的,那么說明這個(gè)知識點(diǎn)還是相對比較重要的啦!
以下的面試題從各種博客上摘抄下來,摘抄量較大的會(huì)注明出處的~
2.1什么是spring?什么是spring?
Spring 是個(gè)java企業(yè)級應(yīng)用的開源開發(fā)框架。Spring主要用來開發(fā)Java應(yīng)用,但是有些擴(kuò)展是針對構(gòu)建J2EE平臺的web應(yīng)用。Spring框架目標(biāo)是簡化Java企業(yè)級應(yīng)用開發(fā),并通過POJO為基礎(chǔ)的編程模型促進(jìn)良好的編程習(xí)慣。
2.2使用Spring框架的好處是什么?使用Spring框架的好處是什么?
輕量:Spring 是輕量的,基本的版本大約2MB。
控制反轉(zhuǎn):Spring通過控制反轉(zhuǎn)實(shí)現(xiàn)了松散耦合,對象們給出它們的依賴,而不是創(chuàng)建或查找依賴的對象們。
面向切面的編程(AOP):Spring支持面向切面的編程,并且把應(yīng)用業(yè)務(wù)邏輯和系統(tǒng)服務(wù)分開。
容器:Spring 包含并管理應(yīng)用中對象的生命周期和配置。
MVC框架:Spring的WEB框架是個(gè)精心設(shè)計(jì)的框架,是Web框架的一個(gè)很好的替代品。
事務(wù)管理:Spring 提供一個(gè)持續(xù)的事務(wù)管理接口,可以擴(kuò)展到上至本地事務(wù)下至全局事務(wù)(JTA)。
異常處理:Spring 提供方便的API把具體技術(shù)相關(guān)的異常(比如由JDBC,Hibernate or JDO拋出的)轉(zhuǎn)化為一致的unchecked 異常。
2.3Spring由哪些模塊組成?Spring由哪些模塊組成?
簡單可以分成6大模塊:
Core
AOP
ORM
DAO
Web
Spring EE
2.4BeanFactory 實(shí)現(xiàn)舉例BeanFactory 實(shí)現(xiàn)舉例
Bean工廠是工廠模式的一個(gè)實(shí)現(xiàn),提供了控制反轉(zhuǎn)功能,用來把應(yīng)用的配置和依賴從正真的應(yīng)用代碼中分離。
在spring3.2之前最常用的是XmlBeanFactory的,但現(xiàn)在被廢棄了,取而代之的是:XmlBeanDefinitionReader和DefaultListableBeanFactory
2.5什么是Spring的依賴注入?什么是Spring的依賴注入?
依賴注入,是IOC的一個(gè)方面,是個(gè)通常的概念,它有多種解釋。這概念是說你不用創(chuàng)建對象,而只需要描述它如何被創(chuàng)建。你不在代碼里直接組裝你的組件和服務(wù),但是要在配置文件里描述哪些組件需要哪些服務(wù),之后一個(gè)容器(IOC容器)負(fù)責(zé)把他們組裝起來。
2.6有哪些不同類型的IOC(依賴注入)方式?有哪些不同類型的IOC(依賴注入)方式?
構(gòu)造器依賴注入:構(gòu)造器依賴注入通過容器觸發(fā)一個(gè)類的構(gòu)造器來實(shí)現(xiàn)的,該類有一系列參數(shù),每個(gè)參數(shù)代表一個(gè)對其他類的依賴。
Setter方法注入:Setter方法注入是容器通過調(diào)用無參構(gòu)造器或無參static工廠 方法實(shí)例化bean之后,調(diào)用該bean的setter方法,即實(shí)現(xiàn)了基于setter的依賴注入。
工廠注入:這個(gè)是遺留下來的,很少用的了!
2.7哪種依賴注入方式你建議使用,構(gòu)造器注入,還是 Setter方法注入?哪種依賴注入方式你建議使用,構(gòu)造器注入,還是 Setter方法注入?
你兩種依賴方式都可以使用,構(gòu)造器注入和Setter方法注入。最好的解決方案是用構(gòu)造器參數(shù)實(shí)現(xiàn)強(qiáng)制依賴,setter方法實(shí)現(xiàn)可選依賴。
2.8什么是Spring beans?什么是Spring beans?
Spring beans 是那些形成Spring應(yīng)用的主干的java對象。它們被Spring IOC容器初始化,裝配,和管理。這些beans通過容器中配置的元數(shù)據(jù)創(chuàng)建。比如,以XML文件中
這里有四種重要的方法給Spring容器提供配置元數(shù)據(jù)。
XML配置文件。
基于注解的配置。
基于java的配置。
Groovy DSL配置
2.9解釋Spring框架中bean的生命周期解釋Spring框架中bean的生命周期
Spring容器 從XML 文件中讀取bean的定義,并實(shí)例化bean。
Spring根據(jù)bean的定義填充所有的屬性。
如果bean實(shí)現(xiàn)了BeanNameAware 接口,Spring 傳遞bean 的ID 到 setBeanName方法。
如果Bean 實(shí)現(xiàn)了 BeanFactoryAware 接口, Spring傳遞beanfactory 給setBeanFactory 方法。
如果有任何與bean相關(guān)聯(lián)的BeanPostProcessors,Spring會(huì)在postProcesserBeforeInitialization()方法內(nèi)調(diào)用它們。
如果bean實(shí)現(xiàn)IntializingBean了,調(diào)用它的afterPropertySet方法,如果bean聲明了初始化方法,調(diào)用此初始化方法。
如果有BeanPostProcessors 和bean 關(guān)聯(lián),這些bean的postProcessAfterInitialization() 方法將被調(diào)用。
如果bean實(shí)現(xiàn)了 DisposableBean,它將調(diào)用destroy()方法。
2.10解釋不同方式的自動(dòng)裝配解釋不同方式的自動(dòng)裝配
no:默認(rèn)的方式是不進(jìn)行自動(dòng)裝配,通過顯式設(shè)置ref 屬性來進(jìn)行裝配。
byName:通過參數(shù)名 自動(dòng)裝配,Spring容器在配置文件中發(fā)現(xiàn)bean的autowire屬性被設(shè)置成byname,之后容器試圖匹配、裝配和該bean的屬性具有相同名字的bean。
byType::通過參數(shù)類型自動(dòng)裝配,Spring容器在配置文件中發(fā)現(xiàn)bean的autowire屬性被設(shè)置成byType,之后容器試圖匹配、裝配和該bean的屬性具有相同類型的bean。如果有多個(gè)bean符合條件,則拋出錯(cuò)誤。
constructor:這個(gè)方式類似于byType, 但是要提供給構(gòu)造器參數(shù),如果沒有確定的帶參數(shù)的構(gòu)造器參數(shù)類型,將會(huì)拋出異常。
autodetect:首先嘗試使用constructor來自動(dòng)裝配,如果無法工作,則使用byType方式。
只用注解的方式時(shí),注解默認(rèn)是使用byType的!
2.11IOC的優(yōu)點(diǎn)是什么?IOC的優(yōu)點(diǎn)是什么?
IOC 或 依賴注入把應(yīng)用的代碼量降到最低。它使應(yīng)用容易測試,單元測試不再需要單例和JNDI查找機(jī)制。最小的代價(jià)和最小的侵入性使松散耦合得以實(shí)現(xiàn)。IOC容器支持加載服務(wù)時(shí)的餓漢式初始化和懶加載。
2.12哪些是重要的bean生命周期方法? 你能重載它們嗎?哪些是重要的bean生命周期方法? 你能重載它們嗎?
有兩個(gè)重要的bean 生命周期方法,第一個(gè)是setup, 它是在容器加載bean的時(shí)候被調(diào)用。第二個(gè)方法是 teardown 它是在容器卸載類的時(shí)候被調(diào)用。
The bean 標(biāo)簽有兩個(gè)重要的屬性(init-method和destroy-method)。用它們你可以自己定制初始化和注銷方法。它們也有相應(yīng)的注解(@PostConstruct和@PreDestroy)。
2.13怎么回答面試官:你對Spring的理解?怎么回答面試官:你對Spring的理解?
來源:
https://www.zhihu.com/question/48427693?sort=created
下面我就截幾個(gè)答案:
一、
二、
2.14Spring框架中的單例Beans是線程安全的么?Spring框架中的單例Beans是線程安全的么?
Spring框架并沒有對單例bean進(jìn)行任何多線程的封裝處理。關(guān)于單例bean的線程安全和并發(fā)問題需要開發(fā)者自行去搞定。但實(shí)際上,大部分的Spring bean并沒有可變的狀態(tài)(比如Serview類和DAO類),所以在某種程度上說Spring的單例bean是線程安全的。如果你的bean有多種狀態(tài)的話(比如 View Model 對象),就需要自行保證線程安全。
最淺顯的解決辦法就是將多態(tài)bean的作用域由“singleton”變更為“prototype”
2.15FileSystemResource和ClassPathResource有何區(qū)別?FileSystemResource和ClassPathResource有何區(qū)別?
在FileSystemResource 中需要給出spring-config.xml文件在你項(xiàng)目中的相對路徑或者絕對路徑。在ClassPathResource中spring會(huì)在ClassPath中自動(dòng)搜尋配置文件,所以要把ClassPathResource文件放在ClassPath下。
如果將spring-config.xml保存在了src文件夾下的話,只需給出配置文件的名稱即可,因?yàn)閟rc文件夾是默認(rèn)。
簡而言之,ClassPathResource在環(huán)境變量中讀取配置文件,F(xiàn)ileSystemResource在配置文件中讀取配置文件。
三、總結(jié)這篇文章的主要知識點(diǎn)我畫了一張思維導(dǎo)圖來總結(jié)啦,當(dāng)學(xué)習(xí)到AOP的時(shí)候,這張思維導(dǎo)圖會(huì)繼續(xù)補(bǔ)充的哦~~~
參考資料:
《Spring 實(shí)戰(zhàn)》
《精通Spring4.x 企業(yè)應(yīng)用開發(fā)實(shí)戰(zhàn)》
https://zhuanlan.zhihu.com/p/29344811--Spring IOC原理總結(jié)
https://blog.csdn.net/u014079773/article/details/52453002---Java面試題集(七)--Spring常見面試問題
https://zhuanlan.zhihu.com/p/31527327--69 個(gè)經(jīng)典 Spring 面試題和答案
如果文章有錯(cuò)的地方歡迎指正,大家互相交流。習(xí)慣在微信看技術(shù)文章,想要獲取更多的Java資源的同學(xué),可以關(guān)注微信公眾號:Java3y。為了大家方便,剛新建了一下qq群:742919422,大家也可以去交流交流。謝謝支持了!希望能多介紹給其他有需要的朋友
文章的目錄導(dǎo)航:
https://zhongfucheng.bitcron.com/post/shou-ji/wen-zhang-dao-hang
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/69476.html
摘要:開啟自動(dòng)配置功能后文詳解這個(gè)注解,學(xué)過的同學(xué)應(yīng)該對它不會(huì)陌生,就是掃描注解,默認(rèn)是掃描當(dāng)前類下的。簡單來說,這個(gè)注解可以幫助我們自動(dòng)載入應(yīng)用程序所需要的所有默認(rèn)配置。簡單理解這二者掃描的對象是不一樣的。 前言 只有光頭才能變強(qiáng)。 文本已收錄至我的GitHub倉庫,歡迎Star:https://github.com/ZhongFuCheng3y/3y 回顧前面Spring的文章(以學(xué)習(xí)...
摘要:是一種特殊的增強(qiáng)切面切面由切點(diǎn)和增強(qiáng)通知組成,它既包括了橫切邏輯的定義也包括了連接點(diǎn)的定義。實(shí)際上,一個(gè)的實(shí)現(xiàn)被拆分到多個(gè)類中在中聲明切面我們知道注解很方便,但是,要想使用注解的方式使用就必須要有源碼因?yàn)槲覀円? 前言 只有光頭才能變強(qiáng) 上一篇已經(jīng)講解了Spring IOC知識點(diǎn)一網(wǎng)打盡!,這篇主要是講解Spring的AOP模塊~ 之前我已經(jīng)寫過一篇關(guān)于AOP的文章了,那篇把比較重要的知...
摘要:簡介本篇文章是容器源碼分析系列文章的最后一篇文章,本篇文章所分析的對象是方法,該方法用于對已完成屬性填充的做最后的初始化工作。后置處理器是拓展點(diǎn)之一,通過實(shí)現(xiàn)后置處理器接口,我們就可以插手的初始化過程。 1. 簡介 本篇文章是Spring IOC 容器源碼分析系列文章的最后一篇文章,本篇文章所分析的對象是 initializeBean 方法,該方法用于對已完成屬性填充的 bean 做最...
摘要:生成的兩種方式通過反射調(diào)用構(gòu)造函數(shù)通過優(yōu)點(diǎn)依賴關(guān)系的管理被反轉(zhuǎn)并交給容器,使復(fù)雜的依賴關(guān)系管理從應(yīng)用中解放出來。 IOC概述 1、理解: (1)控制反轉(zhuǎn)。將生成對象的控制權(quán)交IOC容器,由容器生成依賴的對象。調(diào)用類只依賴接口,而不依賴具體的實(shí)現(xiàn)類,減少了耦合。在運(yùn)行的時(shí)候,才由容器將具體的實(shí)例注入到調(diào)用類的對象中。(2)依賴注入,就是向Ioc容器索要bean的過程。getBean是依賴...
摘要:本文是容器源碼分析系列文章的第一篇文章,將會(huì)著重介紹的一些使用方法和特性,為后續(xù)的源碼分析文章做鋪墊。我們可以通過這兩個(gè)別名獲取到這個(gè)實(shí)例,比如下面的測試代碼測試結(jié)果如下本小節(jié),我們來了解一下這個(gè)特性。 1. 簡介 Spring 是一個(gè)輕量級的企業(yè)級應(yīng)用開發(fā)框架,于 2004 年由 Rod Johnson 發(fā)布了 1.0 版本。經(jīng)過十幾年的迭代,現(xiàn)在的 Spring 框架已經(jīng)非常成熟了...
閱讀 3715·2021-10-14 09:43
閱讀 3311·2021-08-25 09:38
閱讀 609·2019-08-30 15:55
閱讀 1342·2019-08-30 13:05
閱讀 2237·2019-08-29 16:05
閱讀 500·2019-08-29 12:58
閱讀 2790·2019-08-29 12:34
閱讀 3241·2019-08-26 12:15