工廠設(shè)計模式(簡單工廠和工廠方法)
Spring使用工廠模式可以通過BeanFactory或ApplicationContext創(chuàng)建bean對象。
- BeanFactory :延遲注入(使用到某個 bean 的時候才會注入),相比于BeanFactory來說會占用更少的內(nèi)存,程序啟動速度更快。
- ApplicationContext :容器啟動的時候,不管你用沒用到,一次性創(chuàng)建所有 bean 。BeanFactory 僅提供了最基本的依賴注入支持,ApplicationContext 擴(kuò)展了 BeanFactory ,除了有BeanFactory的功能還有額外更多功能,所以一般開發(fā)人員使用ApplicationContext會更多。
單例設(shè)計模式
Spring中bean的默認(rèn)作用域就是singleton。除了singleton作用域,Spring bean還有下面幾種作用域:
- prototype : 每次請求都會創(chuàng)建一個新的 bean 實例。
- request : 每一次HTTP請求都會產(chǎn)生一個新的bean,該bean僅在當(dāng)前HTTP request內(nèi)有效。
- session : 每一次HTTP請求都會產(chǎn)生一個新的 bean,該bean僅在當(dāng)前 HTTP session 內(nèi)有效。
- global-session: 全局session作用域,僅僅在基于portlet的web應(yīng)用中才有意義,Spring5已經(jīng)沒有了。Portlet是能夠生成語義代碼(例如:HTML)片段的小型Java Web插件。它們基于portlet容器,可以像servlet一樣處理HTTP請求。但是,與 servlet 不同,每個 portlet 都有不同的會話。
代理設(shè)計模式
Spring AOP就是基于動態(tài)代理的,如果要代理的對象,實現(xiàn)了某個接口,那么Spring AOP會使用JDK Proxy,去創(chuàng)建代理對象,而對于沒有實現(xiàn)接口的對象,就無法使用JDK Proxy去進(jìn)行代理了,這時候Spring AOP會使用Cglib,這時候Spring AOP會使用Cglib生成一個被代理對象的子類來作為代理。
模板方法設(shè)計模式
Spring中jdbcTemplate、hibernateTemplate等以Template結(jié)尾的對數(shù)據(jù)庫操作的類,它們就使用到模板模式。
觀察者設(shè)計模式
觀察者設(shè)計模式是一種對象行為模式。它表示的是一種對象與對象之間具有依賴關(guān)系,當(dāng)一個對象發(fā)生改變時,這個對象鎖依賴的對象也會做出反應(yīng)。
Spring事件驅(qū)動模型就是觀察者模式很經(jīng)典的應(yīng)用。
- 事件角色:ApplicationEvent(org.springframework.context包下)充當(dāng)事件的角色,這是一個抽象類。
- 事件監(jiān)聽者角色:ApplicationListener充當(dāng)了事件監(jiān)聽者的角色,它是一個接口,里面只定義了一個onApplicationEvent()方法來處理ApplicationEvent。
- 事件發(fā)布者角色:ApplicationEventPublisher充當(dāng)了事件的發(fā)布者,它也是個接口。
適配器設(shè)計模式
適配器設(shè)計模式將一個接口轉(zhuǎn)換成客戶希望的另一個接口,適配器模式使得接口不兼容的那些類可以一起工作,其別名為包裝器。在Spring MVC中,DispatcherServlet根據(jù)請求信息調(diào)用HandlerMapping,解析請求對應(yīng)的Handler,解析到對應(yīng)的Handler(也就是我們常說的Controller控制器)后,開始由HandlerAdapter適配器處理。為什么要在Spring MVC中使用適配器模式?Spring MVC中的Controller種類眾多不同類型的Controller通過不同的方法來對請求進(jìn)行處理,有利于代碼的維護(hù)拓展。