乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Spring 這幾道令人混淆的面試題,怎么說?

       昵稱10087950 2022-06-16 發(fā)布于江蘇

      繼上篇 Spring 開胃菜 之后,這篇我們繼續(xù)來盤盤 Spring 面試題。

      這篇主要介紹幾個(gè)比較容易混淆的概念,防止被問到的時(shí)候一臉懵逼。

      比如 BeanFactory 、FactoryBean、ObjectFactory 的區(qū)別?等等。

      話不多說,發(fā)車!

      BeanFactory 什么用

      BeanFactory 其實(shí)就是 IOC 的底層容器。

      我們都說 Spring 是 IOC 容器,說的再直白點(diǎn),其實(shí)就是 Bean 的工廠,它幫我們生產(chǎn)和管理 Bean,如果我們需要 Bean 就從工廠拿到 bean,所以再來理解下 BeanFactory 這個(gè)名字,就知曉它就是 Spring 的核心。

      例如我們調(diào)用 getBean ,這就是 BeanFactory 定義的方法,通過它得到 Bean。

      不過一般我們所述的 BeanFactory 指的是它實(shí)現(xiàn)類,例如 DefaultListableBeanFactory。

      BeanFactory 本身只是一個(gè)接口。

      FactoryBean 又是啥

      從命名角度來看,我們可以得知它就是一個(gè) Bean,而不是一個(gè)工廠。

      那為什么名字如此奇怪,它其實(shí)是一個(gè)接口,并且有以下幾個(gè)方法

      圖片

      如果一個(gè)對(duì)象實(shí)現(xiàn)了這接口,那它就成為一種特殊的 Bean,注冊(cè)到 IOC 容器之后,如果調(diào)用 getBean 獲取得到的其實(shí)是 FactoryBean#getObject() 方法返回的結(jié)果。

      為什么要這樣做?

      假設(shè)你依賴一個(gè)第三方的類 A,而我們又不能修改第三方的類,并且這個(gè)對(duì)象創(chuàng)建比較復(fù)雜,那么你就可以創(chuàng)建一個(gè) bean 來封裝它:

      public class AFactoryBean implements FactoryBean<A{
          public A getObject() throws Exception {
              A a = new A();
              a.setXXX
              ....
              ...
              return A
          }
          ....省略一些實(shí)現(xiàn)
      }

      這樣,我們 getBean("A") 會(huì)得到 AFactoryBean#getObject 的結(jié)果。

      如果單純只想要 AFactoryBean, 那么加個(gè) “&” 即可,即 getBean("&A")

      ObjectFactory 又是啥

      從命名角度來看,它是一個(gè)工廠。

      圖片

      好吧,攤牌了,沒啥特殊含義,就是一個(gè)工廠。

      在前面我寫的循環(huán)依賴文章里就用到它了,三級(jí)緩存的 map 里面存儲(chǔ)的就是 ObjectFactory,用于延遲代理對(duì)象的創(chuàng)建。

      其實(shí)就是封裝對(duì)象的創(chuàng)建過程,像三級(jí)緩存里的 ObjectFactory 邏輯就是判斷這個(gè) Bean 是否有代理,如果有則返回代理對(duì)象,沒有則返回原來傳入的對(duì)象。

      ApplicationContext 呢

      ApplicationContext 對(duì)我們來說應(yīng)該很熟悉,我們基本上都是基于 ApplicationContext 操作的。

      它也實(shí)現(xiàn)了 BeanFactory 這個(gè)接口,也屬于一個(gè) BeanFactory ,但是它內(nèi)部還包裝了一個(gè) BeanFactory 的實(shí)現(xiàn),這屬于組合

      而關(guān)于 Spring Beans 的一些操作都是委托內(nèi)部的 BeanFactory 來操作的。

      圖片

      所以它有 BeanFactory 的所有功能,并且基于此它還擴(kuò)展了很多其他功能:

      • AOP
      • 國際化
      • 資源管理
      • 事件
      • 注解
      • 等等

      因此,我們開發(fā)直接用的肯定是 ApplicationContext 而不是 BeanFactory。

      Bean 一共有幾種作用域

      從官網(wǎng),我們很容易可以得知,最新版本一共有六種作用域:

      圖片
      • singleton:默認(rèn)是單例,含義不用解釋了吧,一個(gè) IOC 容器內(nèi)部?jī)H此一個(gè)
      • prototype:原型,多實(shí)例
      • request:每個(gè)請(qǐng)求都會(huì)新建一個(gè)屬于自己的 Bean 實(shí)例,這種作用域僅存在 Spring Web 應(yīng)用中
      • session:一個(gè) http session 中有一個(gè) bean 的實(shí)例,這種作用域僅存在 Spring Web 應(yīng)用中
      • application:整個(gè) ServletContext 生命周期里,只有一個(gè) bean,這種作用域僅存在 Spring Web 應(yīng)用中
      • websocket:一個(gè) WebSocket 生命周期內(nèi)一個(gè) bean 實(shí)例,這種作用域僅存在 Spring Web 應(yīng)用中

      別背網(wǎng)上那些多年前的答案了,以上才是最新的~

      Spring 一共有幾種注入方式

      • 構(gòu)造器注入,Spring 倡導(dǎo)構(gòu)造函數(shù)注入,因?yàn)闃?gòu)造器注入返回給客戶端使用的時(shí)候一定是完整的。
      • setter 注入,可選的注入方式,好處是在有變更的情況下,可以重新注入。
      • 字段注入,就是平日我們用 @Autowired 標(biāo)記字段
      • 方法注入,就是平日我們用 @Autowired 標(biāo)記方法
      • 接口回調(diào)注入,就是實(shí)現(xiàn) Spring 定義的一些內(nèi)建接口,例如 BeanFactoryAware,會(huì)進(jìn)行 BeanFactory 的注入

      其實(shí)官網(wǎng)上關(guān)于注入就寫了構(gòu)造器和setter :

      圖片

      像字段注入其實(shí)官方是不推薦的使用的。

      因?yàn)樽侄巫⑷胍蕾囎⒔?,然后無法注入靜態(tài)字段,無法控制成員變量注入順序。

      emmmm...怎么說呢,反正我字段注入用的最多,你們呢,哈哈哈。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多