国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Spring IOC知識點一網打盡!

djfml / 3554人閱讀

摘要:使用的好處知乎的回答不用自己組裝,拿來就用。統一配置,便于修改。

前言
只有光頭才能變強

回顧前面:

給女朋友講解什么是代理模式

包裝模式就是這么簡單啦

單例模式你會幾種寫法?

工廠模式理解了沒有?

在刷Spring書籍的時候花了點時間去學習了單例模式和工廠模式,總的來說還是非常值得的!

本來想的是刷完《Spring 實戰 (第4版)》和《精通Spring4.x 企業應用開發實戰》的IOC章節后來重新編寫一篇IOC的文章的,看了一下之前已經寫過的入門系列Spring入門這一篇就夠了和Spring【依賴注入】就是這么簡單。最主要的知識點都已經講過了,所以感覺就沒必要重新來編寫這些知識點了...

我個人又不喜歡將寫過的東西復制到新的文章中,所以建議大家可以先去閱讀上面兩篇文章再來看這篇(工廠模式那篇如果沒有看過的同學也有必要去看看)~~

為了這篇文章知識點的完整性,重要的知識點(IOC概念理解,創建Bean、注入的三種方式等)還是會出現,但是不會將上面兩篇博文的代碼摘抄過來了。

這篇文章主要是補充和強化一些比較重要的知識點,并會把上面的兩本書關于IOC的知識點整理出來并畫成一個思維導圖來全面了解Spring IOC的知識點!

那么接下來就開始吧,如果有錯的地方希望能多多包涵,并不吝在評論區指正!

一、Spring IOC全面認知

結合《Spring 實戰 (第4版)》和《精通Spring4.x 企業應用開發實戰》兩本書的IOC章節將其知識點整理起來~

1.1IOC和DI概述

在《精通Spring4.x 企業應用開發實戰》中對IOC的定義是這樣的:

IoC(Inversion of Control)控制反轉,包含了兩個方面:一、控制。二、反轉

我們可以簡單認為:

控制指的是:當前對象對內部成員的控制權

反轉指的是:這種控制權不由當前對象管理了,由其他(類,第三方容器)來管理。

IOC不夠開門見山,于是Martin Fowler提出了DI(dependency injection)來替代IoC,即讓調用類對某一接口實現類的依賴關系由第三方(容器或協作類)注入,以移除調用類對某一接口實現類的依賴。

在《Spring 實戰 (第4版)》中并沒有提及到IOC,而是直接來說DI的:

通過DI,對象的依賴關系將由系統中負責協調各對象的第三方組件在創建對象的時候進行設定,對象無需自行創建或管理它們的依賴關系,依賴關系將被自動注入到需要它們的對象當中去

從書上我們也可以發現:IoC和DI的定義(區別)并不是如此容易就可以說得清楚的了。這里我就簡單摘抄一下:

IoC(思想,設計模式)主要的實現方式有兩種:依賴查找,依賴注入

依賴注入是一種更可取的方式(實現的方式)

對我們而言,其實也沒必要分得那么清,混合一談也不影響我們的理解...

再通過昨天寫過的工廠模式理解了沒有?,我們現在就可以很清楚的發現,其實所謂的IOC容器就是一個大工廠【第三方容器】(Spring實現的功能很強大!比我們自己手寫的工廠要好很多)。

使用IOC的好處(知乎@Intopass的回答):

不用自己組裝,拿來就用。

享受單例的好處,效率高,不浪費空間。

便于單元測試,方便切換mock組件。

便于進行AOP操作,對于使用者是透明的。

統一配置,便于修改。

參考資料:

https://www.zhihu.com/question/23277575--Spring IoC有什么好處呢?

1.2IOC容器的原理

從上面就已經說了:IOC容器其實就是一個大工廠,它用來管理我們所有的對象以及依賴關系。

原理就是通過Java的反射技術來實現的!通過反射我們可以獲取類的所有信息(成員變量、類名等等等)!

再通過配置文件(xml)或者注解來描述類與類之間的關系

我們就可以通過這些配置信息和反射技術來構建出對應的對象和依賴關系了!

上面描述的技術只要學過點Java的都能說出來,這一下子可能就會被面試官問倒了,我們簡單來看看實際Spring IOC容器是怎么實現對象的創建和依賴的:

根據Bean配置信息在容器內部創建Bean定義注冊表

根據注冊表加載、實例化bean、建立Bean與Bean之間的依賴關系

將這些準備就緒的Bean放到Map緩存池中,等待應用程序調用

Spring容器(Bean工廠)可簡單分成兩種:

BeanFactory

這是最基礎、面向Spring的

ApplicationContext

這是在BeanFactory基礎之上,面向使用Spring框架的開發者。提供了一系列的功能!

幾乎所有的應用場合都是使用ApplicationContext!

BeanFactory的繼承體系:

ApplicationContext的繼承體系:

其中在ApplicationContext子類中又有一個比較重要的:WebApplicationContext

專門為Web應用準備的

Web應用與Spring融合:

我們看看BeanFactory的生命周期:

接下來我們再看看ApplicationContext的生命周期:

初始化的過程都是比較長,我們可以分類來對其進行解析:

Bean自身的方法:如調用 Bean 構造函數實例化 Bean,調用 Setter 設置 Bean 的屬性值以及通過的 init-method 和 destroy-method 所指定的方法;

Bean級生命周期接口方法:如 BeanNameAware、 BeanFactoryAware、 InitializingBean 和 DisposableBean,這些接口方法由 Bean 類直接實現;

容器級生命周期接口方法:在上圖中帶“★” 的步驟是由 InstantiationAwareBean PostProcessor 和 BeanPostProcessor 這兩個接口實現,一般稱它們的實現類為“ 后處理器” 。 后處理器接口一般不由 Bean 本身實現,它們獨立于 Bean,實現類以容器附加裝置的形式注冊到Spring容器中并通過接口反射為Spring容器預先識別。當Spring 容器創建任何 Bean 的時候,這些后處理器都會發生作用,所以這些后處理器的影響是全局性的。當然,用戶可以通過合理地編寫后處理器,讓其僅對感興趣Bean 進行加工處理

ApplicationContext和BeanFactory不同之處在于:

ApplicationContext會利用Java反射機制自動識別出配置文件中定義的BeanPostProcessor、 InstantiationAwareBeanPostProcesso 和BeanFactoryPostProcessor后置器,并自動將它們注冊到應用上下文中。而BeanFactory需要在代碼中通過手工調用addBeanPostProcessor()方法進行注冊

ApplicationContext在初始化應用上下文的時候就實例化所有單實例的Bean。而BeanFactory在初始化容器的時候并未實例化Bean,直到第一次訪問某個Bean時實例化目標Bean。

有了上面的知識點了,我們再來詳細地看看Bean的初始化過程:

簡要總結:

BeanDefinitionReader讀取Resource所指向的配置文件資源,然后解析配置文件。配置文件中每一個解析成一個BeanDefinition對象,并保存到BeanDefinitionRegistry中;

容器掃描BeanDefinitionRegistry中的BeanDefinition;調用InstantiationStrategy進行Bean實例化的工作;使用BeanWrapper完成Bean屬性的設置工作;

單例Bean緩存池:Spring 在DefaultSingletonBeanRegistry類中提供了一個用于緩存單實例 Bean 的緩存器,它是一個用HashMap實現的緩存器,單實例的Bean以beanName為鍵保存在這個HashMap中。

1.3IOC容器裝配Bean 1.3.1裝配Bean方式

Spring4.x開始IOC容器裝配Bean有4種方式:

XML配置

注解

JavaConfig

基于Groovy DSL配置(這種很少見)

總的來說:我們以XML配置+注解來裝配Bean得多,其中注解這種方式占大部分

1.3.2依賴注入方式

依賴注入的方式有3種方式:

屬性注入-->通過setter()方法注入

構造函數注入

工廠方法注入

總的來說使用屬性注入是比較靈活和方便的,這是大多數人的選擇!

1.3.3對象之間關系

對象之間有三種關系:

依賴-->挺少用的(使用depends-on就是依賴關系了-->前置依賴【依賴的Bean需要初始化之后,當前Bean才會初始化】)

繼承-->可能會用到(指定abstract和parent來實現繼承關系)

引用-->最常見(使用ref就是引用關系了)

1.3.4Bean的作用域

Bean的作用域:

單例Singleton

多例prototype

與Web應用環境相關的Bean作用域

reqeust

session

使用到了Web應用環境相關的Bean作用域的話,是需要我們手動配置代理的~

原因也很簡單:因為我們默認的Bean是單例的,為了適配Web應用環境相關的Bean作用域--->每個request都需要一個對象,此時我們返回一個代理對象出去就可以完成我們的需求了!

將Bean配置單例的時候還有一個問題:

如果我們的Bean配置的是單例,而Bean對象里邊的成員對象我們希望是多例的話。那怎么辦呢??

默認的情況下我們的Bean單例,返回的成員對象也默認是單例的(因為對象就只有那么一個)!

此時我們需要用到了lookup方法注入,使用也很簡單,看看例子就明白了:

1.3.6處理自動裝配的歧義性

昨天在刷書的時候剛好看到了有人在知乎邀請我回答這個問題:

結合兩本書的知識點,可以歸納成兩種解決方案:

使用@Primary注解設置為首選的注入Bean

使用@Qualifier注解設置特定名稱的Bean來限定注入!

也可以使用自定義的注解來標識

1.3.7引用屬性文件以及Bean屬性

之前在寫配置文件的時候都是直接將我們的數據庫配置信息在里面寫死的了:

其實我們有更優雅的做法:將這些配置信息寫到配置文件上(因為這些配置信息很可能是會變的,而且有可能被多個配置文件引用).

如此一來,我們改的時候就十分方便了。

引用配置文件的數據使用的是${}

除了引用配置文件上的數據,我們還可以引用Bean的屬性

引用Bean的屬性使用的是#{}

在這種技術在《Spring 實戰 第四版》稱之為Spring EL,跟我們之前學過的EL表達式是類似的。主要的功能就是上面的那種,想要更深入了解可參考下面的鏈接:

http://www.cnblogs.com/leiOOlei/p/3543222.html

1.3.8組合配置文件

xml文件之間組合:

xml和javaconfig互相組合的方式:

    public static void main(String[] args) {
        
        //1.通過構造函數加載配置類
         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總結

總的來說,Spring IOC容器就是在創建Bean的時候有很多的方式給了我們實現,其中也包括了很多關于Bean的配置~

對于Bean相關的注入教程代碼和簡化配置(p和c名稱空間)我就不一一說明啦,你們去看Spring入門這一篇就夠了和Spring【依賴注入】就是這么簡單就行了。

總的對比圖:


分別的應用場景:

至于一些小的知識點:

方法替換

使用某個Bean的方法替換成另一個Bean的方法

屬性編輯器

Spring可以對基本類型做轉換就歸結于屬性編輯器的功勞!

國際化

使用不同語言(英語、中文)的操作系統去顯式不同的語言

profile與條件化的Bean

滿足了某個條件才初始化Bean,這可以方便切換生產環境和開發環境~

容器事件

類似于我們的Servlet的監聽器,只不過它是在Spring中實現了~

上面這些小知識點比較少情況會用到,這也不去講解啦。知道有這么一回事,到時候查查就會用啦~~~

二、Spring IOC相關面試題

將SpringIOC相關知識點整理了一遍,要想知道哪些知識點是比較重要的。很簡單,我們去找找相關的面試題就知道了,如果該面試題是常見的,那么說明這個知識點還是相對比較重要的啦!

以下的面試題從各種博客上摘抄下來,摘抄量較大的會注明出處的~

2.1什么是spring?
什么是spring?

Spring 是個java企業級應用的開源開發框架。Spring主要用來開發Java應用,但是有些擴展是針對構建J2EE平臺的web應用。Spring框架目標是簡化Java企業級應用開發,并通過POJO為基礎的編程模型促進良好的編程習慣。

2.2使用Spring框架的好處是什么?
使用Spring框架的好處是什么?

輕量:Spring 是輕量的,基本的版本大約2MB。

控制反轉:Spring通過控制反轉實現了松散耦合,對象們給出它們的依賴,而不是創建或查找依賴的對象們。

面向切面的編程(AOP):Spring支持面向切面的編程,并且把應用業務邏輯和系統服務分開。

容器:Spring 包含并管理應用中對象的生命周期和配置。

MVC框架:Spring的WEB框架是個精心設計的框架,是Web框架的一個很好的替代品。

事務管理:Spring 提供一個持續的事務管理接口,可以擴展到上至本地事務下至全局事務(JTA)。

異常處理:Spring 提供方便的API把具體技術相關的異常(比如由JDBC,Hibernate or JDO拋出的)轉化為一致的unchecked 異常。

2.3Spring由哪些模塊組成?
Spring由哪些模塊組成?

簡單可以分成6大模塊:

Core

AOP

ORM

DAO

Web

Spring EE

2.4BeanFactory 實現舉例
BeanFactory 實現舉例

Bean工廠是工廠模式的一個實現,提供了控制反轉功能,用來把應用的配置和依賴從正真的應用代碼中分離

在spring3.2之前最常用的是XmlBeanFactory的,但現在被廢棄了,取而代之的是:XmlBeanDefinitionReader和DefaultListableBeanFactory

2.5什么是Spring的依賴注入?
什么是Spring的依賴注入?

依賴注入,是IOC的一個方面,是個通常的概念,它有多種解釋。這概念是說你不用創建對象,而只需要描述它如何被創建。你不在代碼里直接組裝你的組件和服務,但是要在配置文件里描述哪些組件需要哪些服務,之后一個容器(IOC容器)負責把他們組裝起來。

2.6有哪些不同類型的IOC(依賴注入)方式?
有哪些不同類型的IOC(依賴注入)方式?

構造器依賴注入:構造器依賴注入通過容器觸發一個類的構造器來實現的,該類有一系列參數,每個參數代表一個對其他類的依賴。

Setter方法注入:Setter方法注入是容器通過調用無參構造器或無參static工廠 方法實例化bean之后,調用該bean的setter方法,即實現了基于setter的依賴注入。

工廠注入:這個是遺留下來的,很少用的了!

2.7哪種依賴注入方式你建議使用,構造器注入,還是 Setter方法注入?
哪種依賴注入方式你建議使用,構造器注入,還是 Setter方法注入?

你兩種依賴方式都可以使用,構造器注入和Setter方法注入。最好的解決方案是用構造器參數實現強制依賴,setter方法實現可選依賴

2.8什么是Spring beans?
什么是Spring beans?

Spring beans 是那些形成Spring應用的主干的java對象。它們被Spring IOC容器初始化,裝配,和管理。這些beans通過容器中配置的元數據創建。比如,以XML文件中 的形式定義。

這里有四種重要的方法給Spring容器提供配置元數據

XML配置文件。

基于注解的配置。

基于java的配置。

Groovy DSL配置

2.9解釋Spring框架中bean的生命周期
解釋Spring框架中bean的生命周期

Spring容器 從XML 文件中讀取bean的定義,并實例化bean。

Spring根據bean的定義填充所有的屬性。

如果bean實現了BeanNameAware 接口,Spring 傳遞bean 的ID 到 setBeanName方法。

如果Bean 實現了 BeanFactoryAware 接口, Spring傳遞beanfactory 給setBeanFactory 方法。

如果有任何與bean相關聯的BeanPostProcessors,Spring會在postProcesserBeforeInitialization()方法內調用它們。

如果bean實現IntializingBean了,調用它的afterPropertySet方法,如果bean聲明了初始化方法,調用此初始化方法。

如果有BeanPostProcessors 和bean 關聯,這些bean的postProcessAfterInitialization() 方法將被調用。

如果bean實現了 DisposableBean,它將調用destroy()方法。

2.10解釋不同方式的自動裝配
解釋不同方式的自動裝配

no:默認的方式是不進行自動裝配,通過顯式設置ref 屬性來進行裝配。

byName:通過參數名 自動裝配,Spring容器在配置文件中發現bean的autowire屬性被設置成byname,之后容器試圖匹配、裝配和該bean的屬性具有相同名字的bean。

byType::通過參數類型自動裝配,Spring容器在配置文件中發現bean的autowire屬性被設置成byType,之后容器試圖匹配、裝配和該bean的屬性具有相同類型的bean。如果有多個bean符合條件,則拋出錯誤。

constructor:這個方式類似于byType, 但是要提供給構造器參數,如果沒有確定的帶參數的構造器參數類型,將會拋出異常。

autodetect:首先嘗試使用constructor來自動裝配,如果無法工作,則使用byType方式。

只用注解的方式時,注解默認是使用byType的

2.11IOC的優點是什么?
IOC的優點是什么?

IOC 或 依賴注入把應用的代碼量降到最低。它使應用容易測試,單元測試不再需要單例和JNDI查找機制。最小的代價和最小的侵入性使松散耦合得以實現。IOC容器支持加載服務時的餓漢式初始化和懶加載

2.12哪些是重要的bean生命周期方法? 你能重載它們嗎?
哪些是重要的bean生命周期方法? 你能重載它們嗎?

有兩個重要的bean 生命周期方法,第一個是setup, 它是在容器加載bean的時候被調用。第二個方法是 teardown 它是在容器卸載類的時候被調用。

The bean 標簽有兩個重要的屬性(init-methoddestroy-method)。用它們你可以自己定制初始化和注銷方法。它們也有相應的注解(@PostConstruct@PreDestroy)。

2.13怎么回答面試官:你對Spring的理解?
怎么回答面試官:你對Spring的理解?

來源:

https://www.zhihu.com/question/48427693?sort=created

下面我就截幾個答案:

一、

二、

2.14Spring框架中的單例Beans是線程安全的么?
Spring框架中的單例Beans是線程安全的么?

Spring框架并沒有對單例bean進行任何多線程的封裝處理。關于單例bean的線程安全和并發問題需要開發者自行去搞定。但實際上,大部分的Spring bean并沒有可變的狀態(比如Serview類和DAO類),所以在某種程度上說Spring的單例bean是線程安全的。如果你的bean有多種狀態的話(比如 View Model 對象),就需要自行保證線程安全

最淺顯的解決辦法就是將多態bean的作用域由“singleton”變更為“prototype”

2.15FileSystemResource和ClassPathResource有何區別?
FileSystemResource和ClassPathResource有何區別?

在FileSystemResource 中需要給出spring-config.xml文件在你項目中的相對路徑或者絕對路徑。在ClassPathResource中spring會在ClassPath中自動搜尋配置文件,所以要把ClassPathResource文件放在ClassPath下。

如果將spring-config.xml保存在了src文件夾下的話,只需給出配置文件的名稱即可,因為src文件夾是默認。

簡而言之,ClassPathResource在環境變量中讀取配置文件,FileSystemResource在配置文件中讀取配置文件

三、總結

這篇文章的主要知識點我畫了一張思維導圖來總結啦,當學習到AOP的時候,這張思維導圖會繼續補充的哦~~~

參考資料:

《Spring 實戰》

《精通Spring4.x 企業應用開發實戰》

https://zhuanlan.zhihu.com/p/29344811--Spring IOC原理總結

https://blog.csdn.net/u014079773/article/details/52453002---Java面試題集(七)--Spring常見面試問題

https://zhuanlan.zhihu.com/p/31527327--69 個經典 Spring 面試題和答案

如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同學,可以關注微信公眾號:Java3y。為了大家方便,剛新建了一下qq群:742919422,大家也可以去交流交流。謝謝支持了!希望能多介紹給其他有需要的朋友

文章的目錄導航

https://zhongfucheng.bitcron.com/post/shou-ji/wen-zhang-dao-hang

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/69476.html

相關文章

  • SpringBoot自動配置原理

    摘要:開啟自動配置功能后文詳解這個注解,學過的同學應該對它不會陌生,就是掃描注解,默認是掃描當前類下的。簡單來說,這個注解可以幫助我們自動載入應用程序所需要的所有默認配置。簡單理解這二者掃描的對象是不一樣的。 前言 只有光頭才能變強。 文本已收錄至我的GitHub倉庫,歡迎Star:https://github.com/ZhongFuCheng3y/3y 回顧前面Spring的文章(以學習...

    Rainie 評論0 收藏0
  • Spring AOP就是這么簡單啦

    摘要:是一種特殊的增強切面切面由切點和增強通知組成,它既包括了橫切邏輯的定義也包括了連接點的定義。實際上,一個的實現被拆分到多個類中在中聲明切面我們知道注解很方便,但是,要想使用注解的方式使用就必須要有源碼因為我們要 前言 只有光頭才能變強 上一篇已經講解了Spring IOC知識點一網打盡!,這篇主要是講解Spring的AOP模塊~ 之前我已經寫過一篇關于AOP的文章了,那篇把比較重要的知...

    Jacendfeng 評論0 收藏0
  • Spring IOC 容器源碼分析 - 余下的初始化工作

    摘要:簡介本篇文章是容器源碼分析系列文章的最后一篇文章,本篇文章所分析的對象是方法,該方法用于對已完成屬性填充的做最后的初始化工作。后置處理器是拓展點之一,通過實現后置處理器接口,我們就可以插手的初始化過程。 1. 簡介 本篇文章是Spring IOC 容器源碼分析系列文章的最后一篇文章,本篇文章所分析的對象是 initializeBean 方法,該方法用于對已完成屬性填充的 bean 做最...

    Alfred 評論0 收藏0
  • Spring知識——IOC容器

    摘要:生成的兩種方式通過反射調用構造函數通過優點依賴關系的管理被反轉并交給容器,使復雜的依賴關系管理從應用中解放出來。 IOC概述 1、理解: (1)控制反轉。將生成對象的控制權交IOC容器,由容器生成依賴的對象。調用類只依賴接口,而不依賴具體的實現類,減少了耦合。在運行的時候,才由容器將具體的實例注入到調用類的對象中。(2)依賴注入,就是向Ioc容器索要bean的過程。getBean是依賴...

    yexiaobai 評論0 收藏0
  • Spring IOC 容器源碼分析系列文章導讀

    摘要:本文是容器源碼分析系列文章的第一篇文章,將會著重介紹的一些使用方法和特性,為后續的源碼分析文章做鋪墊。我們可以通過這兩個別名獲取到這個實例,比如下面的測試代碼測試結果如下本小節,我們來了解一下這個特性。 1. 簡介 Spring 是一個輕量級的企業級應用開發框架,于 2004 年由 Rod Johnson 發布了 1.0 版本。經過十幾年的迭代,現在的 Spring 框架已經非常成熟了...

    NSFish 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<