您的位置:  首頁 > 技術 > java語言 > 正文

談談對Spring IOC的理解

2021-07-08 22:11 管理員 次閱讀 條評論

IOC(Inversion Of Controll,控制反轉)是一種設計思想,就是將原本在程序中手動創建對象的控制權,交由給Spring框架來管理。

??IOC在其他語言中也有應用,并非Spring特有。IOC容器是Spring用來實現IOC的載體,IOC容器實際上就是一個Map(key, value),Map中存放的是各種對象。


??將對象之間的相互依賴關系交給IOC容器來管理,并由IOC容器完成對象的注入。這樣可以很大程度上簡化應用的開發,把應用從復雜的依賴關系中解放出來。IOC容器就像是一個工廠一樣,當我們需要創建一個對象的時候,只需要配置好配置文件/注解即可,完全不用考慮對象是如何被創建出來的。在實際項目中一個Service類可能由幾百甚至上千個類作為它的底層,假如我們需要實例化這個Service,可能要每次都搞清楚這個Service所有底層類的構造函數,這是不現實的。如果利用IOC的話,你只需要配置好,然后在需要的地方引用就行了,大大增加了項目的可維護性且降低了開發難度。

??Spring時代我們一般通過XML文件來配置Bean,后來開發人員覺得用XML文件來配置不太友好,于是Sprng Boot注解配置就慢慢開始流行起來。


Spring中的bean的作用域有哪些?

spring 支持 5 種作用域,如下:

??? singleton:唯一bean實例,Spring中的bean默認都是單例的。

??? prototype:每次請求都會創建一個新的bean實例。

??? request:每一次HTTP請求都會產生一個新的bean,該bean僅在當前HTTP request內有效。

??? session:每一次HTTP請求都會產生一個新的bean,該bean僅在當前HTTP session內有效。

??? global-session:全局session作用域,僅僅在基于Portlet的Web應用中才有意義,Spring5中已經沒有了。Portlet是能夠生成語義代碼(例如HTML)片段的小型Java Web插件。它們基于Portlet容器,可以像Servlet一樣處理HTTP請求。但是與Servlet不同,每個Portlet都有不同的會話。

Spring中的bean生命周期?

??? Bean容器找到配置文件中Spring Bean的定義。

??? Bean容器利用Java Reflection API創建一個Bean的實例。

??? 如果涉及到一些屬性值,利用set()方法設置一些屬性值。

??? 如果Bean實現了BeanNameAware接口,調用setBeanName()方法,傳入Bean的名字。



??? 如果Bean實現了BeanClassLoaderAware接口,調用setBeanClassLoader()方法,傳入ClassLoader對象的實例。

??? 如果Bean實現了BeanFactoryAware接口,調用setBeanClassFacotory()方法,傳入ClassLoader對象的實例。

??? 與上面的類似,如果實現了其他*Aware接口,就調用相應的方法。

??? 如果有和加載這個Bean的Spring容器相關的BeanPostProcessor對象,執行postProcessBeforeInitialization()方法。

??? 如果Bean實現了InitializingBean接口,執行afeterPropertiesSet()方法。

??? 如果Bean在配置文件中的定義包含init-method屬性,執行指定的方法。

??? 如果有和加載這個Bean的Spring容器相關的BeanPostProcess對象,執行postProcessAfterInitialization()方法。

??? 當要銷毀Bean的時候,如果Bean實現了DisposableBean接口,執行destroy()方法。

??? 當要銷毀Bean的時候,如果Bean在配置文件中的定義包含destroy-method屬性,執行指定的方法。

追問3: Spring 中的 bean 是線程安全的嗎?

??Spring容器中的Bean是否線程安全,容器本身并沒有提供Bean的線程安全策略,因此可以說Spring容器中的Bean本身不具備線程安全的特性,但是具體還是要結合具體scope的Bean去研究。

??結合上面提到的Spring bean 的作用域(scope)

??? 對于prototype作用域的Bean,每次都創建一個新對象,也就是線程之間不存在Bean共享,因此不會有線程安全問題。
??? 對于singleton作用域的Bean,所有的線程都共享一個單例實例的Bean,因此是存在線程安全問題的。但是如果單例Bean是一個無狀態Bean,也就是線程中的操作不會對Bean的成員執行查詢以外的操作,那么這個單例Bean是線程安全的。比如Controller類、Service類和Dao等,這些Bean大多是無狀態的,只關注于方法本身。

??????? 有狀態Bean(Stateful Bean) :就是有實例變量的對象,可以保存數據,是非線程安全的。
??????? 無狀態Bean(Stateless Bean):就是沒有實例變量的對象,不能保存數據,是不變類,是線程安全的。

??線程安全這個問題,要從單例與原型Bean分別進行說明。

??對于有狀態的bean(比如ModelAndView),就需要自行保證線程安全,最淺顯的解決辦法就是將有狀態的bean的作用域由“singleton”改為“prototype”。也可以采用ThreadLocal解決線程安全問題,為每個線程提供一個獨立的變量副本,不同線程只操作自己線程的副本變量。

??ThreadLocal和線程同步機制都是為了解決多線程中相同變量的訪問沖突問題。

??? 同步機制:采用了“時間換空間”的方式,僅提供一份變量,不同的線程在訪問前需要獲取鎖,沒獲得鎖的線程則需要排隊。

??? ThreadLocal:采用了“空間換時間”的方式。ThreadLocal會為每一個線程提供一個獨立的變量副本,從而隔離了多個線程對數據的訪問沖突。因為每一個線程都擁有自己的變量副本,從而也就沒有必要對該變量進行同步了。

一下 SpringMVC 運行流程?

在這里插入圖片描述

流程說明:

??? 客戶端(瀏覽器)發送請求,直接請求到DispatcherServlet。

??? DispatcherServlet根據請求信息調用HandlerMapping,解析請求對應的Handler。

??? 解析到對應的Handler(也就是我們平常說的Controller控制器)。

??? HandlerAdapter會根據Handler來調用真正的處理器(對應的接口)來處理請求和執行相對應的業務邏輯。

??? 處理器處理完業務后,會返回一個ModelAndView對象,Model是返回的數據對象,View是邏輯上的View。

??? ViewResolver(視圖解析器)會根據邏輯View去查找實際的View。

??? DispatcherServlet把返回的Model傳給View(視圖渲染)。

??? 把View返回給請求者(瀏覽器)。

追問1:能介紹一下SpringMVC各組件的作用么?

??? DispatcherServlet:前端控制器。用戶請求到達前端控制器,它就相當于mvc模式中的c,dispatcherServlet是整個流程控制的中心,由它調用其它組件處理用戶的請求,dispatcherServlet的存在降低了組件之間的耦合性,系統擴展性提高。由框架實現
??? HandlerMapping:處理器映射器。HandlerMapping負責根據用戶請求的url找到Handler即處理器,springmvc提供了不同的映射器實現不同的映射方式,根據一定的規則去查找,例如:xml配置方式,實現接口方式,注解方式等。由框架實現
??? Handler:處理器。Handler 是繼DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler對具體的用戶請求進行處理。由于Handler涉及到具體的用戶業務請求,所以一般情況需要程序員根據業務需求開發Handler。
??? HandlAdapter:處理器適配器。通過HandlerAdapter對處理器進行執行,這是適配器模式的應用,通過擴展適配器可以對更多類型的處理器進行執行。由框架實現。
??? ModelAndView:是springmvc的封裝對象,將model和view封裝在一起。
??? ViewResolver:視圖解析器。ViewResolver負責將處理結果生成View視圖,ViewResolver首先根據邏輯視圖名解析成物理視圖名即具體的頁面地址,再生成View視圖對象,最后對View進行渲染將處理結果通過頁面展示給用戶。
??? View:是springmvc的封裝對象,是一個接口, springmvc框架提供了很多的View視圖類型,包括:jspview,pdfview,jstlView、freemarkerView、pdfView等。一般情況下需要通過頁面標簽或頁面模版技術將模型數據通過頁面展示給用戶,需要由程序員根據業務需求開發具體的頁面。


  • 0
    感動
  • 0
    路過
  • 0
    高興
  • 0
    難過
  • 0
    搞笑
  • 0
    無聊
  • 0
    憤怒
  • 0
    同情
熱度排行
友情鏈接
18禁高潮出水呻吟娇喘mp3,日本熟妇乱人伦A片免费高清,成人午夜精品无码区,狠狠色噜噜色狠狠狠综合久久,麻豆一区二区99久久久久,年轻的妈妈4,少妇被又大又粗又爽毛片,护士张开腿让我爽了一夜,男男互攻互受h啪肉np文,你好神枪手电视剧免费观看啊,97人妻一区二区精品免费,久久久婷婷五月亚洲97号色,freegaysexvideos男男中国,国产精品国产三级国av麻豆,国产精品又黄又爽又色无遮挡网站,亚洲av无码一区二区三区网站,亚洲国产精品久久久久蜜桃,国产真人无码作爱视频免费,国产成人精品亚洲一区二区三区,亚洲欧洲日产最新,老司机带带我精彩免费,国产成人久久精品激情,日本最新av免费一区二区三区,边摸边吃奶又黄又激烈视频
<蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>