java面經查缺補漏之四十九天(繼續聊spring的一些問題,以及Juc包的簡單梳理)

1.bean的作用域?

(1)singleton:默認,每個容器中只有一個bean的實例,單例的模式由BeanFactory自身來維護。

(2)prototype:爲每一個bean請求提供一個實例。

(3)request:爲每一個網絡請求創建一個實例,在請求完成以後,bean會失效並被垃圾回收器回收。

(4)session:與request範圍類似,確保每個session中有一個bean的實例,在session過期後,bean會隨之失效。

2. spring如何解決循環依賴的問題?

https://blog.csdn.net/u010853261/article/details/77940767?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4

3. spring用到了哪些設計模式?

代理模式—在AOP中被用的比較多。

單例模式—在spring配置文件中定義的bean默認爲單例模式。

模板方法—用來解決代碼重複的問題。比如. RestTemplate, JmsTemplate, JpaTemplate。

工廠模式—BeanFactory用來創建對象的實例。

適配器--spring aop

裝飾器--spring data hashmapper

觀察者-- spring 事件驅動模型

4.FactoryBean?

5. springbean的生命週期?

(1)實例化Bean:

對於BeanFactory容器,當客戶向容器請求一個尚未初始化的bean時,或初始化bean的時候需要注入另一個尚未初始化的依賴時,容器就會調用createBean進行實例化。對於ApplicationContext容器,當容器啓動結束後,通過獲取BeanDefinition對象中的信息,實例化所有的bean。

(2)設置對象屬性(依賴注入):

實例化後的對象被封裝在BeanWrapper對象中,緊接着,Spring根據BeanDefinition中的信息 以及 通過BeanWrapper提供的設置屬性的接口完成依賴注入。

(3)處理Aware接口:

接着,Spring會檢測該對象是否實現了xxxAware接口,並將相關的xxxAware實例注入給Bean:

①如果這個Bean已經實現了BeanNameAware接口,會調用它實現的setBeanName(String beanId)方法,此處傳遞的就是Spring配置文件中Bean的id值;

②如果這個Bean已經實現了BeanFactoryAware接口,會調用它實現的setBeanFactory()方法,傳遞的是Spring工廠自身。

③如果這個Bean已經實現了ApplicationContextAware接口,會調用setApplicationContext(ApplicationContext)方法,傳入Spring上下文;

(4)BeanPostProcessor:

如果想對Bean進行一些自定義的處理,那麼可以讓Bean實現了BeanPostProcessor接口,那將會調用postProcessBeforeInitialization(Object obj, String s)方法。

(5)InitializingBean 與 init-method:

如果Bean在Spring配置文件中配置了 init-method 屬性,則會自動調用其配置的初始化方法。

(6)如果這個Bean實現了BeanPostProcessor接口,將會調用postProcessAfterInitialization(Object obj, String s)方法;由於這個方法是在Bean初始化結束時調用的,所以可以被應用於內存或緩存技術;

以上幾個步驟完成後,Bean就已經被正確創建了,之後就可以使用這個Bean了。

(7)DisposableBean:

當Bean不再需要時,會經過清理階段,如果Bean實現了DisposableBean這個接口,會調用其實現的destroy()方法;

(8)destroy-method:

最後,如果這個Bean的Spring配置中配置了destroy-method屬性,會自動調用其配置的銷燬方法。

6. springbean爲什麼默認是單例的?

生成bean的時候,會先判斷是單例的還是原型的,getBean方法,如果是單例的話,那麼就先在緩存中獲取。

優點:

(1)減少了新生成實例的消耗

新生成實例消耗包括兩方面,第一,spring會通過反射或者cglib來生成bean實例這都是耗性能的操作,其次給對象分配內存也會涉及複雜算法。

(2)減少jvm垃圾回收

由於不會給每個請求都新生成bean實例,所以自然回收的對象少了。

(3)可以快速獲取到bean

因爲單例的獲取bean操作除了第一次生成之外其餘的都是從緩存裏獲取的所以很快。

缺點:

單例的bean一個很大的劣勢就是他不能做到線程安全!!!

7.Juc包下知道哪些類,並且作用是什麼?

java.util.concurrent

參考:

https://blog.csdn.net/qq_37330730/article/details/97695122

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