您好,登錄后才能下訂單哦!
【前言】
前些日子,咱們一起學習過Java里面的注解。今天呢,就學習一下Springboot注解,從框架的組成原理上一點點的熟悉這個框架。
【Spring】
提到SpringBoot那你就得先了解Spring是什么?因為SpringBoot是一個簡化Spring開發(fā)的框架。
A、Spring是一個輕量級控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架;
控制反轉(zhuǎn)——Spring通過一種稱作控制反轉(zhuǎn)(IoC)的技術(shù)促進了松耦合
面向切面——Spring提供了面向切面編程的豐富支持
B、Spring的Web模塊;
Web上下文模塊建立于應用上下文模塊之上,提供了一個適合于Web應用的上下文。另外,這個模塊還提供了一些面向服務支持。例如:實現(xiàn)文件上傳的multipart請求,它也提供了Spring和其它Web框架的集成,比如Struts、WebWork。
C、Spring的MVC框架;
Spring為構(gòu)建Web應用提供了一個功能全面的MVC框架。雖然Spring可以很容易地與其它MVC框架集成,例如Struts,但Spring的MVC框架使用IoC對控制邏輯和業(yè)務對象提供了完全的分離。
它也允許你聲明性地將請求參數(shù)綁定到你的業(yè)務對象中,此外,Spring的MVC框架還可以利用Spring的任何其它服務,例如國際化信息與驗證。
********
【Springmvc架構(gòu)原理解析】
第一步:發(fā)起請求到前端控制器(DispatcherServlet)
第二步:前端控制器請求HandlerMapping查找 Handler可以根據(jù)xml配置、注解進行查找
第三步:處理器映射器HandlerMapping向前端控制器返回Handler
第四步:前端控制器調(diào)用處理器適配器去執(zhí)行Handler
第五步:處理器適配器去執(zhí)行Handler
第六步:Handler執(zhí)行完成給適配器返回ModelAndView
第七步:處理器適配器向前端控制器返回ModelAndView
ModelAndView是springmvc框架的一個底層對象,包括 Model和view
第八步:前端控制器請求視圖解析器去進行視圖解析
根據(jù)邏輯視圖名解析成真正的視圖(jsp)
第九步:視圖解析器向前端控制器返回View
第十步:前端控制器進行視圖渲染
視圖渲染將模型數(shù)據(jù)(在ModelAndView對象中)填充到request域
第十一步:前端控制器向用戶響應結(jié)果
組件:
①、前端控制器DispatcherServlet(不需要程序員開發(fā))作用接收請求,響應結(jié)果,相當于轉(zhuǎn)發(fā)器,中央處理器。有了DispatcherServlet減少了其它組件之間的耦合度。
②、處理器映射器HandlerMapping(不需要程序員開發(fā))作用:根據(jù)請求的url查找Handler
3、處理器適配器HandlerAdapter作用:按照特定規(guī)則(HandlerAdapter要求的規(guī)則)去執(zhí)行Handler
③、處理器Handler(需要程序員開發(fā))注意:編寫Handler時按照HandlerAdapter的要求去做,這樣適配器才可以去正確執(zhí)行Handler
④、視圖解析器View resolver(不需要程序員開發(fā))作用:進行視圖解析,根據(jù)邏輯視圖名解析成真正的視圖(view)
⑤、視圖View(需要程序員開發(fā)jsp)View是一個接口,實現(xiàn)類支持不同的View類型(jsp、freemarker、pdf…)
*******
【SpringMVC常用注解】
@Controller
負責注冊一個bean 到spring 上下文中
@RequestMapping
注解為控制器指定可以處理哪些 URL 請求
@RequestBody
該注解用于讀取Request請求的body部分數(shù)據(jù),使用系統(tǒng)默認配置的HttpMessageConverter進行解析,然后把相應的數(shù)據(jù)綁定到要返回的對象上 ,再把HttpMessageConverter返回的對象數(shù)據(jù)綁定到 controller中方法的參數(shù)上
@ResponseBody
該注解用于將Controller的方法返回的對象,通過適當?shù)腍ttpMessageConverter轉(zhuǎn)換為指定格式后,寫入到Response對象的body數(shù)據(jù)區(qū)
@ModelAttribute
在方法定義上使用 @ModelAttribute 注解:Spring MVC 在調(diào)用目標處理方法前,會先逐個調(diào)用在方法級上標注了@ModelAttribute 的方法
在方法的入?yún)⑶笆褂?@ModelAttribute 注解:可以從隱含對象中獲取隱含的模型數(shù)據(jù)中獲取對象,再將請求參數(shù) –綁定到對象中,再傳入入?yún)⒎椒ㄈ雲(yún)ο筇砑拥侥P椭?/p>
@RequestParam
在處理方法入?yún)⑻幨褂?@RequestParam 可以把請求參 數(shù)傳遞給請求方法
@PathVariable
綁定 URL 占位符到入?yún)?/p>
@ExceptionHandler
注解到方法上,出現(xiàn)異常時會執(zhí)行該方法
@ControllerAdvice
使一個Contoller成為全局的異常處理類,類中用@ExceptionHandler方法注解的方法可以處理所有Controller發(fā)生的異常
【SpringMVC與Struts2區(qū)別比較】
A、spring mvc 和 struts2的加載機制不同:spring mvc的入口是servlet,而struts2是filter(servlet和filter區(qū)別見本文最后)
B、Struts2框架是類級別的攔截
C、SpringMVC是方法級別的攔截
【JPA注解】
@Entity:表明這是一個實體類。
@MappedSuperClass:用在確定是父類的entity上。父類的屬性子類可以繼承。
@NoRepositoryBean:一般用作父類的repository,有這個注解,spring不會去實例化該repository。
@Column:如果字段名與列名相同,則可以省略。
@Id:表示該屬性為主鍵。
@JoinColumn(name=”loginId”):一對一:本表中指向另一個表的外鍵。一對多:另一個表指向本表的外鍵。
@OneToOne、@OneToMany、@ManyToOne:對應hibernate配置文件中的一對一,一對多,多對一。
【全局異常注解】
@ControllerAdvice:包含@Component??梢员粧呙璧?。統(tǒng)一處理異常。
@ExceptionHandler(Exception.class):用在方法上面表示遇到這個異常就執(zhí)行以下方法。
【項目中具體配置解析和使用環(huán)境注解】
@MappedSuperclass:
1.@MappedSuperclass 注解使用在父類上面,是用來標識父類的
2.@MappedSuperclass 標識的類表示其不能映射到數(shù)據(jù)庫表,因為其不是一個完整的實體類,但是它所擁有的屬性能夠映射在其子類對用的數(shù)據(jù)庫表中
3.@MappedSuperclass 標識的類不能再有@Entity或@Table注解
@Column:
1.當實體的屬性與其映射的數(shù)據(jù)庫表的列不同名時需要使用@Column標注說明,該屬性通常置于實體的屬性聲明語句之前,還可與 @Id 標注一起使用。
2.@Column 標注的常用屬性是name,用于設置映射數(shù)據(jù)庫表的列名。此外,該標注還包含其它多個屬性,如:unique、nullable、length、precision等。
【執(zhí)行持久化方法,按發(fā)生時間執(zhí)行的回調(diào)函數(shù)】
@javax.persistence.PostLoad:加載后。
@javax.persistence.PrePersist:持久化前。
@javax.persistence.PostPersist:持久化后。
@javax.persistence.PreUpdate:更新前。
@javax.persistence.PostUpdate:更新后。
@javax.persistence.PreRemove:刪除前。
@javax.persistence.PostRemove:刪除后。
【數(shù)據(jù)庫注解】
1)增
@PrePersist和@PostPersist事件在實體對象插入到數(shù)據(jù)庫的過程中發(fā)生:
@PrePersist事件在調(diào)用persist()方法后立刻發(fā)生,此時的數(shù)據(jù)還沒有真正插入進數(shù)據(jù)庫。
@PostPersist事件在數(shù)據(jù)已經(jīng)插入進數(shù)據(jù)庫后發(fā)生。
2)刪
@PreRemove和@PostRemove事件的觸發(fā)由刪除實體引起:
@PreRemove事件在實體從數(shù)據(jù)庫刪除之前觸發(fā),即在調(diào)用remove()方法刪除時發(fā)生,此時的數(shù)據(jù)還沒有真正從數(shù)據(jù)庫中刪除。
@PostRemove事件在實體從數(shù)據(jù)庫中刪除后觸發(fā)。
3)改
@PreUpdate和@PostUpdate事件的觸發(fā)由更新實體引起:
@PreUpdate事件在實體的狀態(tài)同步到數(shù)據(jù)庫之前觸發(fā),此時的數(shù)據(jù)還沒有真正更新到數(shù)據(jù)庫。
@PostUpdate事件在實體的狀態(tài)同步到數(shù)據(jù)庫之后觸發(fā),同步在事務提交時發(fā)生。
4)查
@PostLoad事件在下列情況下觸發(fā):
執(zhí)行EntityManager.find()或getreference()方法載入一個實體后。
執(zhí)行JPQL查詢后。
EntityManager.refresh()方法被調(diào)用后。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。