天天看點

SpringBoot注解(舉一反三,發散思維)

【前言】

前些日子,咱們一起學習過Java裡面的注解。今天呢,就學習一下Springboot注解,從架構的組成原理上一點點的熟悉這個架構。

【Spring】

提到SpringBoot那你就得先了解Spring是什麼?因為SpringBoot是一個簡化Spring開發的架構。

A、Spring是一個輕量級控制反轉(IoC)和面向切面(AOP)的容器架構;

控制反轉——Spring通過一種稱作控制反轉(IoC)的技術促進了松耦合

面向切面——Spring提供了面向切面程式設計的豐富支援

B、Spring的Web子產品;

Web上下文子產品建立于應用上下文子產品之上,提供了一個适合于Web應用的上下文。另外,這個子產品還提供了一些面向服務支援。例如:實作檔案上傳的multipart請求,它也提供了Spring和其它Web架構的內建,比如Struts、WebWork。

C、Spring的MVC架構;

Spring為建構Web應用提供了一個功能全面的MVC架構。雖然Spring可以很容易地與其它MVC架構內建,例如Struts,但Spring的MVC架構使用IoC對控制邏輯和業務對象提供了完全的分離。

它也允許你聲明性地将請求參數綁定到你的業務對象中,此外,Spring的MVC架構還可以利用Spring的任何其它服務,例如國際化資訊與驗證。

********

【Springmvc架構原了解析】

第一步:發起請求到前端控制器(DispatcherServlet)

第二步:前端控制器請求HandlerMapping查找 Handler可以根據xml配置、注解進行查找

第三步:處理器映射器HandlerMapping向前端控制器傳回Handler

第四步:前端控制器調用處理器擴充卡去執行Handler

第五步:處理器擴充卡去執行Handler

第六步:Handler執行完成給擴充卡傳回ModelAndView

第七步:處理器擴充卡向前端控制器傳回ModelAndView

ModelAndView是springmvc架構的一個底層對象,包括 Model和view

第八步:前端控制器請求視圖解析器去進行視圖解析

根據邏輯視圖名解析成真正的視圖(jsp)

第九步:視圖解析器向前端控制器傳回View

第十步:前端控制器進行視圖渲染

視圖渲染将模型資料(在ModelAndView對象中)填充到request域

第十一步:前端控制器向使用者響應結果

元件:

①、前端控制器DispatcherServlet(不需要程式員開發)作用接收請求,響應結果,相當于轉發器,中央處理器。有了DispatcherServlet減少了其它元件之間的耦合度。

②、處理器映射器HandlerMapping(不需要程式員開發)作用:根據請求的url查找Handler

3、處理器擴充卡HandlerAdapter作用:按照特定規則(HandlerAdapter要求的規則)去執行Handler

③、處理器Handler(需要程式員開發)注意:編寫Handler時按照HandlerAdapter的要求去做,這樣擴充卡才可以去正确執行Handler

④、視圖解析器View resolver(不需要程式員開發)作用:進行視圖解析,根據邏輯視圖名解析成真正的視圖(view)

⑤、視圖View(需要程式員開發jsp)View是一個接口,實作類支援不同的View類型(jsp、freemarker、pdf…)

*******

【SpringMVC常用注解】

@Controller

負責注冊一個bean 到spring 上下文中

@RequestMapping

注解為控制器指定可以處理哪些 URL 請求

@RequestBody

該注解用于讀取Request請求的body部分資料,使用系統預設配置的HttpMessageConverter進行解析,然後把相應的資料綁定到要傳回的對象上 ,再把HttpMessageConverter傳回的對象資料綁定到 controller中方法的參數上

@ResponseBody

該注解用于将Controller的方法傳回的對象,通過适當的HttpMessageConverter轉換為指定格式後,寫入到Response對象的body資料區

@ModelAttribute

在方法定義上使用 @ModelAttribute 注解:Spring MVC 在調用目标處理方法前,會先逐個調用在方法級上标注了@ModelAttribute 的方法

在方法的入參前使用 @ModelAttribute 注解:可以從隐含對象中擷取隐含的模型資料中擷取對象,再将請求參數 –綁定到對象中,再傳入入參将方法入參對象添加到模型中

@RequestParam

在處理方法入參處使用 @RequestParam 可以把請求參 數傳遞給請求方法

@PathVariable

綁定 URL 占位符到入參

@ExceptionHandler

注解到方法上,出現異常時會執行該方法

@ControllerAdvice

使一個Contoller成為全局的異常處理類,類中用@ExceptionHandler方法注解的方法可以處理所有Controller發生的異常

【SpringMVC與Struts2差別比較】

A、spring mvc 和 struts2的加載機制不同:spring mvc的入口是servlet,而struts2是filter(servlet和filter差別見本文最後)

B、Struts2架構是類級别的攔截

C、SpringMVC是方法級别的攔截

【JPA注解】

@Entity:表明這是一個實體類。

@MappedSuperClass:用在确定是父類的entity上。父類的屬性子類可以繼承。

@NoRepositoryBean:一般用作父類的repository,有這個注解,spring不會去執行個體化該repository。

@Column:如果字段名與列名相同,則可以省略。

@Id:表示該屬性為主鍵。

@JoinColumn(name=”loginId”):一對一:本表中指向另一個表的外鍵。一對多:另一個表指向本表的外鍵。

@OneToOne、@OneToMany、@ManyToOne:對應hibernate配置檔案中的一對一,一對多,多對一。

【全局異常注解】

@ControllerAdvice:包含@Component。可以被掃描到。統一處理異常。

@ExceptionHandler(Exception.class):用在方法上面表示遇到這個異常就執行以下方法。

【項目中具體配置解析和使用環境注解】

@MappedSuperclass:

1.@MappedSuperclass 注解使用在父類上面,是用來辨別父類的

2.@MappedSuperclass 辨別的類表示其不能映射到資料庫表,因為其不是一個完整的實體類,但是它所擁有的屬性能夠映射在其子類對用的資料庫表中

3.@MappedSuperclass 辨別的類不能再有@Entity或@Table注解

@Column:

1.當實體的屬性與其映射的資料庫表的列不同名時需要使用@Column标注說明,該屬性通常置于實體的屬性聲明語句之前,還可與 @Id 标注一起使用。

2.@Column 标注的常用屬性是name,用于設定映射資料庫表的列名。此外,該标注還包含其它多個屬性,如:unique、nullable、length、precision等。

【執行持久化方法,按發生時間執行的回調函數】

@javax.persistence.PostLoad:加載後。

@javax.persistence.PrePersist:持久化前。

@javax.persistence.PostPersist:持久化後。

@javax.persistence.PreUpdate:更新前。

@javax.persistence.PostUpdate:更新後。

@javax.persistence.PreRemove:删除前。

@javax.persistence.PostRemove:删除後。

【資料庫注解】

1)增

@PrePersist和@PostPersist事件在實體對象插入到資料庫的過程中發生:

@PrePersist事件在調用persist()方法後立刻發生,此時的資料還沒有真正插入進資料庫。

@PostPersist事件在資料已經插入進資料庫後發生。

2)删

@PreRemove和@PostRemove事件的觸發由删除實體引起:

@PreRemove事件在實體從資料庫删除之前觸發,即在調用remove()方法删除時發生,此時的資料還沒有真正從資料庫中删除。

@PostRemove事件在實體從資料庫中删除後觸發。

3)改

@PreUpdate和@PostUpdate事件的觸發由更新實體引起:

@PreUpdate事件在實體的狀态同步到資料庫之前觸發,此時的資料還沒有真正更新到資料庫。

@PostUpdate事件在實體的狀态同步到資料庫之後觸發,同步在事務送出時發生。

4)查

@PostLoad事件在下列情況下觸發:

執行EntityManager.find()或getreference()方法載入一個實體後。

執行JPQL查詢後。

EntityManager.refresh()方法被調用後。