【Spring】-入門

註解彙總

@Service用於標註業務層組件,表示定義一個bean,自動根據bean的類名實例化一個首寫字母爲小寫的bean
@Controller用於標註控制層組件(如struts中的action)
@Repository用於標註數據訪問組件,即DAO組件
@Component泛指組件,當組件不好歸類的時候,我們可以使用這個註解進行標註。

@Scope默認是"singleton"即單例
@prototype表示原型即每次都會new一個新的出來

AutoWire

@Autowired和@Resource兩個註解的區別:
@Autowired默認按照byType方式進行bean匹配,
@Resource默認按照byName方式進行bean匹配
@Autowired是Spring的註解,
@Resource是J2EE的註解,
這個看一下導入註解的時候這兩個註解的包名就一清二楚了
@Autowired 自動裝配 可以省略get和set方法;
當Spring發現@Autowired註解時,將自動在代碼上下文中找到和其匹配(默認是類型匹配)的Bean,並自動注入到相應的地方去
@Autowired接口注入
如果有一個接口,對應一個實現類,則可以正常裝配;
如果有一個接口,有多個實現:
 @Autowired
 @Qualifier(“xxx”)
 注意@Qualifier註解括號裏面的應當是接口實現類的類名
@Resource的裝配順序:
 @Resource後面沒有任何內容,默認通過name屬性去匹配bean,找不到再按type去匹配
 指定了name或者type則根據指定的類型去匹配bean
指定了name和type則根據指定的name和type去匹配bean,任何一個不匹配都將報錯

注入規則

把DAO實現類注入到service實現類中,
把service的接口(注意不要是service的實現類)注入到action中
@Autowired後不需要getter()和setter()方法,Spring也會自動注入。至於更具體的內容,等對注入的方式更

SpringMVC流程

Spring MVC的控制器是單例模式,線程不安全
在這裏插入圖片描述

  1. 用戶發送請求至前端控制器DispatcherServlet。
  2. DispatcherServlet收到請求調用HandlerMapping處理器映射器。
  3. 處理器映射器根據請求url找到具體的處理器,生成處理器對象及處理器攔截器(如果有則生成)一併返回給DispatcherServlet。
  4. DispatcherServlet通過HandlerAdapter處理器適配器調用處理器。
  5. 執行處理器(Controller,也叫後端控制器)。
  6. Controller執行完成返回ModelAndView。
  7. HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet。
  8. DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器。
  9. ViewReslover解析後返回具體View。
  10. DispatcherServlet對View進行渲染視圖(即將模型數據填充至視圖中)。
    DispatcherServlet響應用戶

SpringMVC註解&驅動器

context:component-scan/ 掃描指定的包中的類上的註解,常用的註解有:
@Controller 聲明Action組件 控制器的註解,
@Service 聲明Service組件 @Service(“myMovieLister”)
@Repository 聲明Dao組件
@Component 泛指組件, 當不好歸類時.
@RequestMapping("/menu") 請求映射
@Resource 用於注入,( j2ee提供的 ) 默認按名稱裝配,@Resource(name=“beanName”)
@Autowired 用於注入,(srping提供的) 默認按類型裝配
@Transactional( rollbackFor={Exception.class}) 事務管理
@ResponseBody
@Scope(“prototype”) 設定bean的作用域、
@RequestMapping
作用類上是父路徑
作用於方法上處理器
建議不要捨棄類定義的RequestMapping
支持佔位符風格定義
URL中的{xxx}佔位符可以通過@PathVariable(“xxx”)綁定到操作的入參上
@RequestMapping有六個參數。分別是:
1.value
用於設置方法或者類的映射路徑,可以直接寫路徑,即@RequestMapping("/Student");==@RequestMapping(value="/Student");
2.method
用於指定請求的方法,可以設置單個或多個,如果請求方法不滿足條件則會請求失敗。
3.params
這個參數比較特殊,他和後續講到的@RequestParam的作用有點像,不過params是可以指定多個url攜帶的參數,而@RequestParam只可以對一個參數進行註解。
4.headers
headers這個參數,讓人有種望文生義的感覺。看着這個單詞就大概可以猜到,他是和請求頭部有關,而事實上也確實是這樣。用於指定請求的headers,必須要含有這個headers纔可以請求。
前四個感覺還是很重要的,特別是前兩個,但是最後兩個就不清楚以後是否要用到。

5.consumes
用於指定處理何種請求的提交內容類型context-type,如果不是指定的類型,則不處理。提交的類型會在頁面就有提示,比如說,一般的網頁是text/html

  1. produces
    按道理來說這個也應該是要滿足什麼要求才進行處理,所以說這個應該是請求中accept含有produces中指定的內容類型纔可以進行處理。例如
    produces=“application/json”
    意思就是,請求中accept含有application/json的內容類型纔可以進行處理。
    這個完全不知道什麼回事。暫且先這樣留着。

SpringMVC和Spring父子容器

 Spring框架,容器是核心思想,用管理Bean的整個生命週期的;
 Spring中可以包括多個容器,容器有上下層關係
 最常是項目中引入Spring和SpringMVC這兩個框架,它其實就是兩個容器,
 Spring是父容器,SpringMVC是其子容器,
 在Spring父容器中註冊的Bean對於SpringMVC容器中是可見的,
 而在SpringMVC容器中註冊的Bean對於Spring父容器中是不可見的,
 就是子容器可以看見父容器中的註冊的Bean,反之就不行

Spring和Springmvc和作爲兩個獨立的容器,
會把掃描到的註解對象分別放到兩個不同的容器中
Springmvc容器是spring容器的一部分,他們訪問對象的範圍如下所示:
①:springmvc子容器可以訪問spring父容器中的對象
②:spring父容器不能訪問springmvc子容器中的對象

在這裏插入圖片描述

IOC &&AOP

IoC(Inversion of Control)
(1). IoC(Inversion of Control)是指容器控制程序對象之間的關係,而不是傳統實現中,由程序代碼直接操控。控制權由應用代碼中轉到了外部容器,控制權的轉移是所謂反轉。 對於Spring而言,就是由Spring來控制對象的生命週期和對象之間的關係;IoC還有另外一個名字——“依賴注入(Dependency Injection)”。從名字上理解,所謂依賴注入,即組件之間的依賴關係由容器在運行期決定,即由容器動態地將某種依賴關係注入到組件之中。
(2). 在Spring的工作方式中,所有的類都會在spring容器中登記,告訴spring這是個什麼東西,你需要什麼東西,然後spring會在系統運行到適當的時候,把你要的東西主動給你,同時也把你交給其他需要你的東西。所有的類的創建、銷燬都由 spring來控制,也就是說控制對象生存週期的不再是引用它的對象,而是spring。對於某個具體的對象而言,以前是它控制其他對象,現在是所有對象都被spring控制,所以這叫控制反轉。
(3). 在系統運行中,動態的向某個對象提供它所需要的其他對象。
(4). 依賴注入的思想是通過反射機制實現的,在實例化一個類時,它通過反射調用類中set方法將事先保存在HashMap中的類屬性注入到類中。 總而言之,在傳統的對象創建方式中,通常由調用者來創建被調用者的實例,而在Spring中創建被調用者的工作由Spring來完成,然後注入調用者,即所謂的依賴注入or控制反轉。 注入方式有兩種:依賴注入和設置注入; IoC的優點:降低了組件之間的耦合,降低了業務對象之間替換的複雜性,使之能夠靈活的管理對象。
AOP(Aspect Oriented Programming)
(1). AOP面向方面編程基於IoC,是對OOP的有益補充;
(2). AOP利用一種稱爲“橫切”的技術,剖解開封裝的對象內部,並將那些影響了 多個類的公共行爲封裝到一個可重用模塊,並將其名爲“Aspect”,即方面。所謂“方面”,簡單地說,就是將那些與業務無關,卻爲業務模塊所共同調用的 邏輯或責任封裝起來,比如日誌記錄,便於減少系統的重複代碼,降低模塊間的耦合度,並有利於未來的可操作性和可維護性。
(3). AOP代表的是一個橫向的關 系,將“對象”比作一個空心的圓柱體,其中封裝的是對象的屬性和行爲;則面向方面編程的方法,就是將這個圓柱體以切面形式剖開,選擇性的提供業務邏輯。而 剖開的切面,也就是所謂的“方面”了。然後它又以巧奪天功的妙手將這些剖開的切面復原,不留痕跡,但完成了效果。
(4). 實現AOP的技術,主要分爲兩大類:一是採用動態代理技術,利用截取消息的方式,對該消息進行裝飾,以取代原有對象行爲的執行;二是採用靜態織入的方式,引入特定的語法創建“方面”,從而使得編譯器可以在編譯期間織入有關“方面”的代碼。
(5). Spring實現AOP:JDK動態代理和CGLIB代理 JDK動態代理:其代理對象必須是某個接口的實現,它是通過在運行期間創建一個接口的實現類來完成對目標對象的代理;其核心的兩個類是InvocationHandler和Proxy。 CGLIB代理:實現原理類似於JDK動態代理,只是它在運行期間生成的代理對象是針對目標類擴展的子類。CGLIB是高效的代碼生成包,底層是依靠ASM(開源的java字節碼編輯類庫)操作字節碼實現的,性能比JDK強;需要引入包asm.jar和cglib.jar。 使用AspectJ注入式切面和@AspectJ註解驅動的切面實際上底層也是通過動態代理實現的。
(6). AOP使用場景:
Authentication 權限檢查
Caching 緩存
Context passing 內容傳遞
Error handling 錯誤處理
Lazy loading 延遲加載
Debugging  調試
logging, tracing, profiling and monitoring 日誌記錄,跟蹤,優化,校準
Performance optimization 性能優化,效率檢查
Persistence  持久化
Resource pooling 資源池
Synchronization 同步
Transactions 事務管理
另外Filter的實現和struts2的攔截器的實現都是AOP思想的體現。

$ 和

${key名稱}
1.用戶獲取外部文件(properties)中指定key的值;配置文件數據
2.可以在xml中配置,也可以出現在@value註解中
3.一般用於獲取數據庫配置內容信息
#{表達式}
1.spring中el表達式的格式
2.可以在xml中配置,也可以出現在@value註解中
3.可以任意表達式,支持運算符
4.一般用於數據庫sql語句的獲取字段信息,可以防止sql注入

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