面試官:Spring框架內置了哪些可擴展接口,咱們一個一個聊

公衆號[JavaQ]原創,專注分享Java基礎原理分析、實戰技術、微服務架構、分佈式系統構建,誠邀點贊關注!

面試官:如果想在一個Bean被實例化時做一些額外的初始化操作,如何實現?

小小白:有兩種方法,一個是使用@PostConstruct註解或init-method指定初始化方法,另一個是這個Bean實現InitializingBean接口,InitializingBean接口中只有一個afterPropertiesSet方法,這個方法是在Bean的屬性都設置值後被調用,用於完成一些初始化工作。

面試官:afterPropertiesSet方法和init-method指定的方法執行的先後順序有了解過嗎?

小小白:afterPropertiesSet方法先執行,init-method指定的方法後執行。

面試官:像這種初始化方法,在使用上有什麼需要注意的?

小小白:這兩種方式都是用於完成一些初始化工作,所以相應的方法中儘量不要編寫一些複雜且執行時間很長的邏輯,例如網絡請求、IO操作。

面試官:那如果想在Bean被銷燬回收的時候做一些額外的操作,如何操作?

小小白:同樣也是兩種方法,一個是使用@PreDestroy註解或destroy-method指定銷燬方法,另一個是這個Bean實現DisposableBean接口,DisposableBean接口中只有一個destroy方法,該方法會在Bean被銷燬、生命週期結束之前被調用,用於做一些銷燬的收尾工作。DisposableBean接口的destroy方法先於destroy-method指定的方法先執行。

面試官:如果想在Bean被加載的過程中獲取Spring的應用上下文ApplicationContext,如何實現?

小小白:Spring框架中有一個ApplicationContextAware接口,接口有一個setApplicationContext方法,只要Bean實現了ApplicationContextAware接口,就可以在該Bean被加載的過程中獲取Spring的應用上下文ApplicationContext,通過ApplicationContext可以獲取Spring容器內的很多信息。

面試官:說到獲取Spring的應用上下文ApplicationContext,在基於Spring MVC的Web應用中,如何獲取WebApplicationContext?

小小白:Spring框架提供了一個WebApplicationContextUtils工具類,通過這個工具類的getWebApplicationContext方法可以獲取到。

面試官:如果想在Bean被加載的過程中獲取加載該Bean的BeanFactory,如何實現?

小小白:Spring框架中有一個BeanFactoryAware接口,接口中有一個setBeanFactory方法。實現了BeanFactoryAware接口的Bean,可以在該Bean被加載的過程中獲取加載該Bean的BeanFactory,同時也可以獲取這個BeanFactory中加載的其它Bean。

面試官:那這個setBeanFactory方法在什麼時候被調用的?

小小白:在Bean實例化後,Setter方法之前調用。

面試官:如果要定製Bean的實例化邏輯,如何實現?

小小白:Spring框架的FactoryBean接口可以實現Bean實例化的個性定製,讓Spring容器加載我們想要的Bean。實現了FactoryBean接口的類,可以通過實現getObject方法,實現加載我們想要的Bean。

面試官:說到FactoryBean,BeanFactory和FactoryBean有什麼區別?

小小白:BeanFactory定義了ioc容器的最基本形式,並提供了ioc容器應遵守的的最基本的接口,也就是Spring ioc所遵守的最底層和最基本的編程規範,它只是個接口,並不是ioc容器的具體實現。它的職責包括:實例化、定位、配置應用程序中的對象及建立這些對象間的依賴。再來說說FactoryBean,一般情況下,Spring通過反射機制利用bean的class屬性實例化Bean,然而在某些情況下,實例化Bean過程比較複雜,如果按照傳統的方式,則需要在bean的定義中提供大量的配置信息,而配置這種方式的靈活性是受限的,這時採用編碼的方式可能會是一個比較合適的方案,Spring爲此提供了FactoryBean的工廠類接口,用戶可以通過實現該接口定製實例化Bean的邏輯。

面試官:有了解過Spring中的BeanPostProcessor接口嗎?

小小白:BeanPostProcessor接口中有兩個方法,分別爲postProcessBeforeInitialization和postProcessAfterInitialization。實現了BeanPostProcessor接口的類,會在每個Bean初始化(即調用setter)之前和之後,分別調用這個類中的postProcessBeforeInitialization方法和postProcessAfterInitialization方法,實現初始化的邏輯控制。

面試官:如果想在初始化前修改bean的屬性,如何實現?

小小白:BeanFactoryPostProcessor接口中只有postProcessBeanFactory方法。實現了該接口的類,可以在Bean被創建之前,獲取容器中Bean的定義信息,並且可以進行修改。實現類中的postProcessBeanFactory方法只會被執行一次,且先於BeanPostProcessor接口的方法。

面試官:如果想在Bean實例化調用構造函數前後做一些額外操作,如何實現?

小小白:Spring框架的InstantiationAwareBeanPostProcessor接口中,常用的方法是postProcessBeforeInstantiation和postProcessAfterInstantiation。每個Bean的實例化(即調用構造函數)之前和之後,會分別調用實現了該接口的類中的postProcessBeforeInstantiation和postProcessAfterInstantiation方法,所以只要自定義一個實現InstantiationAwareBeanPostProcessor接口的類,實現接口中的這兩個方法,在這兩個方法中就可以做額外的操作了。


往期推薦

Spring聲明式事務處理的實現原理,來自面試官的窮追拷問

Spring MVC相關面試題就是無底洞,反正我是怕了

說實話,面試這麼問Spring框架的問題,我快扛不住了

沒使用加號拼接字符串,面試官竟然問我爲什麼

面試官一步一步的套路你,爲什麼SimpleDateFormat不是線程安全的

都說ThreadLocal被面試官問爛了,可爲什麼面試官還是喜歡繼續問

Java註解是如何玩轉的,面試官和我聊了半個小時

如何去除代碼中的多次if而引發的一連串面試問題

三分鐘快速搞定git常規使用

String引發的提問,我差點跪了

就寫了一行代碼,被問了這麼多問題

面試官:JVM對鎖進行了優化,都優化了啥?

synchronized連環問

點點"在看" 唄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章