免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

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

2022.06.16 江蘇

關注

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

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

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

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

BeanFactory 什么用

BeanFactory 其實就是 IOC 的底層容器。

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

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

不過一般我們所述的 BeanFactory 指的是它實現類,例如 DefaultListableBeanFactory。

BeanFactory 本身只是一個接口。

FactoryBean 又是啥

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

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

如果一個對象實現了這接口,那它就成為一種特殊的 Bean,注冊到 IOC 容器之后,如果調用 getBean 獲取得到的其實是 FactoryBean#getObject() 方法返回的結果。

為什么要這樣做?

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

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

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

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

ObjectFactory 又是啥

從命名角度來看,它是一個工廠。

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

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

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

ApplicationContext 呢

ApplicationContext 對我們來說應該很熟悉,我們基本上都是基于 ApplicationContext 操作的。

它也實現了 BeanFactory 這個接口,也屬于一個 BeanFactory ,但是它內部還包裝了一個 BeanFactory 的實現,這屬于組合。

而關于 Spring Beans 的一些操作都是委托內部的 BeanFactory 來操作的

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

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

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

Bean 一共有幾種作用域

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

  • singleton:默認是單例,含義不用解釋了吧,一個 IOC 容器內部僅此一個
  • prototype:原型,多實例
  • request:每個請求都會新建一個屬于自己的 Bean 實例,這種作用域僅存在 Spring Web 應用中
  • session:一個 http session 中有一個 bean 的實例,這種作用域僅存在 Spring Web 應用中
  • application:整個 ServletContext 生命周期里,只有一個 bean,這種作用域僅存在 Spring Web 應用中
  • websocket:一個 WebSocket 生命周期內一個 bean 實例,這種作用域僅存在 Spring Web 應用中

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

Spring 一共有幾種注入方式

  • 構造器注入,Spring 倡導構造函數注入,因為構造器注入返回給客戶端使用的時候一定是完整的。
  • setter 注入,可選的注入方式,好處是在有變更的情況下,可以重新注入。
  • 字段注入,就是平日我們用 @Autowired 標記字段
  • 方法注入,就是平日我們用 @Autowired 標記方法
  • 接口回調注入,就是實現 Spring 定義的一些內建接口,例如 BeanFactoryAware,會進行 BeanFactory 的注入

其實官網上關于注入就寫了構造器和setter :

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

因為字段注入依賴注解,然后無法注入靜態(tài)字段,無法控制成員變量注入順序。

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

。

本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
死磕Spring之IoC篇 - 深入了解Spring IoC(面試題)
【小家Spring】一文讀懂Spring中的BeanFactory和FactoryBean(以及它和ObjectFactory的區(qū)別)的區(qū)別
SpringBean初始化過程
SpringIOC源碼解析(2)—— 簡單容器
Spring8:一些常用的Spring Bean擴展接口
Spring核心容器 BeanFactory和ApplicationContext 簡介
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯系客服!

聯系客服